
Custom Renderer 사용자 지정 렌더러
Renderer 는 Xamarin Forms 로 정의된 뷰를 플랫폼이 제공해주는 컨드롤과 연결하는 역할을 합니다. 예를 들어 Xamarin Forms 의 Entry 는 프레임워크가 기본으로 제공해주는 플랫폼 별 EntryRenderer 를 통해 플랫폼 별 컨트롤로 연결됩니다. 예를 들어, 안드로이드의 EntryRenderer 는 안드로이드 플랫폼의 EditText 컨트롤과 연결하고, iOS의 EntryRenderer는 iOS 플랫폼의 UITextField 컨트롤과 연결합니다.

Xamarin Forms 가 기본으로 제공해주는 UI 요소는 모두 Xamarin 개발팀에서 제공해주는 기본 Renderer 가 있습니다. 하지만 어플리케이션을 개발하다보면 가끔 Renderer 를 직접 작성해야 하는 경우가 있습니다. 제가 Renderer 를 직접 개발해야 했던 경우는 키보드 위에 메뉴가 붙도록 만들려는데, 플랫폼 별로 키보드가 화면에 나타날 때 UI 에 영향을 미치는 방식이 달라 기본 Renderer 로는 제대로 표현할 수 없었을 때였습니다.
이처럼 Custom Renderer 은 Xamarin Forms 로 개발한 UI를 플랫폼에 맞춰 개발할 수 있도록 해주는 강력한 기능입니다. 이처럼 Renderer 는 플랫폼에 직접적으로 관여할 수 있어서 강력한 기능이지만, 플랫폼에 직접적으로 관여하게 되니 어플리케이션 성능에 적잖은 영향을 미치므로 작성할 때 주의가 필요합니다. 그리고 Renderer 대신 Effects 로 플랫폼 종속적인 UI 조작이 가능하므로 Effects 로 구현이 가능한지 먼저 검토하고 나서 Custom Renderer 를 작성하길 추천드립니다.
Custom Renderer 은 아래 순서로 구현하게 됩니다.
- Xamarin Forms 에 View 를 정의한다.
- 플랫폼별 Renderer 를 구현한다.
1. Xamarin Forms 에 View 를 정의한다.
public partial class MyView : View
{
public MyView()
{
InitializeComponent();
}
}
2. 플랫폼별 Renderer 를 구현한다.
// Renderer 를 Xamarin Forms 에 등록하는 Attribute 입니다.
[assembly: ExportRenderer (typeof(MyView), typeof(MyViewRenderer))]
namespace Solution.Platform
{
// ViewRenderer 는 제일 기본이 되는 Renderer 로 반드시 상속해야 합니다.
public class MyViewRenderer : ViewRenderer<MyView, Platform_Specific_Control>
{
// OnElementChanged 는 반드시 구현해야 하는 메서드입니다.
protected override void OnElementChanged (ElementChangedEventArgs<MyView> e)
{
base.OnElementChanged (e);
}
}
}
코드를 나눠서 설명드리겠습니다.
[assembly: ExportRenderer (typeof(MyView), typeof(MyViewRenderer))]
Renderer 를 등록하는 Attribute 입니다.
public class MyViewRenderer : ViewRenderer<MyView, Platform_Specific_Control>
ViewRenderer<T1, T2> 를 상속하면서 Xamarin Forms 에서 정의한 View 와 플랫폼 컨트롤을 연결하는 코드입니다. 플랫폼 별로 작성하려는 View 를 표현할 수 있는 Platform_Specific_Control 을 지정해야 합니다.
protected override void OnElementChanged (ElementChangedEventArgs<MyView> e)
{
base.OnElementChanged (e);
}
플랫폼 컨트롤과 연결된 후 실행되는 메서드로 Renderer 를 생성한 뒤 실행된다고 생각해도 무방합니다. 여기서는 주로 플랫폼 컨트롤을 생성해서 객체 속성으로 저장하거나, 이벤트를 연결하는 등의 작업이 수행됩니다.
연구 노트
제가 Custom Renderer 를 조사하면서 제일 어려웠던 건 공식 API 문서가 없다는 겁니다. 따라서 소스코드 메타데이터의 이름으로 ViewRenderer 의 속성과 메서드를 어림짐작해서 사용해야 합니다.
일단 제가 나름 연구한 사항을 아래에 적어 드리도록 하겠습니다. 개인적으로 소스코드를 보거나, 코드를 디버깅하여 추정하는 연구 결과이므로 참고만 해주시길 바랍니다.
ViewRenderer.Control은 플랫폼 컨트롤을 의미한다.ViewRenderer.CreateNativeControl()메서드를 override 해서 플랫폼 컨트롤을 생성할 수 있다.ViewRenderer.SetNativeControl()메서드를 호출해야ViewRenderer.Control를 변경할 수 있다.ViewRenderer는VisualElementRenderer를 상속한다.VisualElementRenderer.Element가 Xamarin Forms 에서 정의한 View 다.VisualElementRenderer.SetElement()로VisualElementRenderer.Element를 변경할 수 있다.VisualElementRenderer.OnElementPropertyChanged()메서드를 override 해서 데이터 바인딩된 속성이 변경되었을 때 대응할 수 있다.
'Develop > MAUI 가이드' 카테고리의 다른 글
| [Xamarin] BindableProperty 구현하고 관리하는 방법 (0) | 2020.12.17 |
|---|---|
| [Xamarin] Effects 로 Platform-Specific 하게 구현하기 (0) | 2020.11.17 |
| [Xamarin] 픽셀 및 기기 독립 Unit (Device-Independent Units) (0) | 2020.08.21 |
| [Xamarin] 성능 개선 - OneTime Binding (0) | 2020.08.14 |
| [.NET] .NET 통합과 MAUI 란? (6) | 2020.08.06 |
꾸준히 노력하는 개발자 "김예건" 입니다.