본문 바로가기

XAMARIN

[Xamarin] Custom Renderer 로 Platform-Specific 하게 구현하기 Custom Renderer 사용자 지정 렌더러 Renderer 는 Xamarin Forms 로 정의된 뷰를 플랫폼이 제공해주는 컨드롤과 연결하는 역할을 합니다. 예를 들어 Xamarin Forms 의 Entry 는 프레임워크가 기본으로 제공해주는 플랫폼 별 EntryRenderer 를 통해 플랫폼 별 컨트롤로 연결됩니다. 예를 들어, 안드로이드의 EntryRenderer 는 안드로이드 플랫폼의 EditText 컨트롤과 연결하고, iOS의 EntryRenderer는 iOS 플랫폼의 UITextField 컨트롤과 연결합니다. Xamarin Forms 가 기본으로 제공해주는 UI 요소는 모두 Xamarin 개발팀에서 제공해주는 기본 Renderer 가 있습니다. 하지만 어플리케이션을 개발하다보면 가끔 Ren..
[Xamarin] 픽셀 및 기기 독립 Unit (Device-Independent Units) 픽셀 및 기기 독립 Unit Xamarin 은 크로스 플랫폼, 더 나아가 모든 플랫폼을 지원하려는 야망을 가진 프레임워크입니다. 따라서 기기마다 다른 Unit 기준을 충족시켜야만 합니다. 개발자에게는 이게 무슨 소린지 감이 잡히질 않습니다. 왜냐하면 개발자는 디지털 단위인 픽셀 에 익숙해져 있기 때문입니다. 개발자에게 화면이란 픽셀로 이루어져 있는 장치이며, 픽셀만 맞추면 화면에 잘 표시될 것 같은 헛된 믿음을 가집니다. 하지만 디자이너에게 중요한건 실제 화면에 표현되는 물리적인 비율이 중요합니다. 픽셀만 맞춰서 개발을 하게 되면 화면에 따라 크기가 달라 보입니다! 특히 스마트폰의 화면 크기는 모두 제각각입니다. 심지어 화면마다 표현할 수 있는 픽셀 수도 기기마다 다릅니다. 간단한 실험으로 픽셀을 믿을 ..
[Xamarin] 성능 개선 - OneTime Binding 성능 개선 - OneTime Binding Compiled Binding 보다 성능을 더 끌어올릴 수 있는 바인딩 방식으로 OneTime Binding 이 있습니다. 이름에서 알 수 있듯이, 최초에 BindingContext가 바뀔 때만 값이 바인딩되고 INotifyPropertyChanged 이벤트를 구독하지 않는 방식입니다. 따라서 이벤트를 구독하고 처리하는 과정이 없어지므로 성능이 개선되는 원리입니다. OneTime Binding 방식이 도움이 되는 때는 UI가 처음 생성될 때만 바인딩하고 이후로는 값이 변경되지 않을 때입니다.OneTime Binding이 유용할 수 있는 사례를 아래에 소개드리도록 하겠습니다. Command를 바인딩할 때 Command 같은 경우 메서드를 바인딩하는데, 런타임에 메..
[Xamarin] ResourceDictionary 깔끔하게 정리 ResourceDictionary 깔끔하게 정리 아래처럼 View 마다 ResourceDictionary가 있을 경우, 중복되는 XAML 코드도 발생하게 되고 같은 객체를 중복하여 생성하게 되므로, 비효율적입니다. ContentViewA.xaml #FFFFFF 따라서 먼저 아래처럼 ResouceDictionary를 분리된 파일로 만듭니다. ContentViewA.xaml ResourceDictionary.xaml #FFFFFF 하지만 ResourceDictionary.xaml 처럼 모든 리소스를 한 곳에서 관리하게 되면 불필요한 리소스까지 공유하게 되는 문제가 있습니다. 따라서 아래처럼 리소스를 자신만의 기준에 맞춰 분리하도록 합니다. ContentViewA.xaml ResourceDictionary.x..
[Xamarin] 성능 개선 - Compiled Binding 성능 개선 - Compiled Binding Xamarin 의 핵심 아키텍처는 Model-View-ViewModel 패턴입니다. 따라서 View 와 ViewModel 을 연결할 때 Data Binding을 집중적으로 사용하게 됩니다. 그리고 Data Binding은 View의 속성과 ViewModel의 속성을 연결하고 연결된 속성을 해석하기 위해 Reflection 기술을 사용하는데, Reflection 기술은 런타임에 많은 리소스를 소비합니다. 따라서 컴파일할 때 바인딩될 속성 타입을 명시해서 성능을 개선할 수 있습니다. 이를 Compiled Binding 이라 합니다. Compiled Binding 를 진행하기 위해선 XAML 코드가 컴파일 되어야 합니다. 이 글을 따라 XAML 코드가 컴파일되도록 ..
[Xamarin] 성능 개선 - XAML 컴파일 성능 개선 - XAML 컴파일 XAML 코드는 View 의 디자인을 위해 사용하는 마크업 언어라, 컴파일하여 배포하는 언어가 아닙니다. 그래서 Xamarin 앱을 배포하면 XAML 코드는 .xaml 파일 그대로 배포되고, 런타임에 동적으로 해석해서 View 를 만듭니다. 개발자 입장에서 런타임에 동적으로 XAML 코드를 해석하는건 Hot Reload 같이 디버깅을 하는 경우를 제외하고는 성능을 희생해서 얻는 메리트가 없습니다. 따라서 XAML 코드를 CLR 이 해석할 수 있는 IL (Intermediate Language) 코드로 변환하도록 설정하여 간단하게 성능을 개선하여 봅시다. Assembly 단위로 XAML 코드를 컴파일하도록 설정 [assembly: XamlCompilation (XamlComp..
[Xamarin] TypedDataTemplateSelector TypedDataTempalteSelector WPF 프로그램을 개발하면 ItemsControl.ItemTemplate 에 DataTemplate 을 등록해서 ItemsControl.ItemSource 에 ViewModel 이 추가될 때마다 ViewModel 타입에 맞는 View가 추가되는데, Xamarin 는 WPF 처럼 DataTemplate.DataType을 지원하지 않아 반드시 DataTemplateSelector를 사용해야만 합니다. 문제는 DataTemplateSelector 를 ViewModel 타입에 따라 선택하게 구현하려면 아래와 같이 클린하지 않은 코드를 만들 수 밖에 없습니다. public class MyDataTemplateSelector : DataTemplateSelector {..
[Xamarin] MvvmCross 데이터 바인딩 MvvmCross 데이터 바인딩 데이터 바인딩은 MVVM 패턴에서 제일 핵심적인 기능입니다. 데이터 바인딩을 통해 View와 ViewModel 이 서로의 참조 변수를 가지지 않는 형태로 느슨한 결합을 유지할 수 있습니다. MVVM 패턴을 의도했지만 데이터 바인딩을 사용하지 않는다면 MVVM 패턴을 활용하지 못하는 겁니다. MvvmCross에서 데이터 바인딩을 구현하는 순서는 아래와 같습니다. ViewModel에 속성이 변경될 때마다 이벤트를 발생시키도록 구현한다. View에 ViewModel을 연결한다. View 속성에 ViewModel 속성을 Binding 한다. 1. ViewModel에 속성이 변경될 때마다 이벤트를 발생시키도록 구현한다. 데이터 바인딩의 핵심은 ViewModel이 INotifyPro..