Skip to content

Instantly share code, notes, and snippets.

@jameymcelveen
Last active August 29, 2015 14:05
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jameymcelveen/8d2ad94174dacfb0f3e5 to your computer and use it in GitHub Desktop.
Save jameymcelveen/8d2ad94174dacfb0f3e5 to your computer and use it in GitHub Desktop.
Pixate iOS helper for Xamarin.Forms. This class copies style info from Xamarin.Forms elements into the underlying native component.
using System;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
using YourProject.iOS;
using System.ComponentModel;
using MonoTouch.UIKit;
using MonoTouch.Foundation;
using PixateFreestyleLib;
using Common;
[assembly: ExportRenderer(typeof(Entry), typeof(StyledEntryRenderer))]
[assembly: ExportRenderer(typeof(Button), typeof(StyledButtonRenderer))]
[assembly: ExportRenderer(typeof(Image), typeof(StyledImageRenderer))]
[assembly: ExportRenderer(typeof(Label), typeof(StyledLabelRenderer))]
[assembly: ExportRenderer (typeof(ListView), typeof(StyledListViewRenderer))]
[assembly: ExportRenderer (typeof(ViewCell), typeof(StyledViewCellRenderer))]
[assembly: ExportRenderer (typeof(TextCell), typeof(StyledTextCellRenderer))]
[assembly: ExportRenderer (typeof(ImageCell), typeof(StyledImageCellRenderer))]
namespace YourProject.iOS
{
public static class StyledRenderer {
public static void UpdateStyle (UIView view, VisualElement model = null) {
var styleId = model.StyleId;
var classId = model.ClassId;
UpdateStyle (view, styleId, classId);
}
public static void UpdateStyle (UIView view, string styleId, string classId) {
if (!string.IsNullOrWhiteSpace (styleId)) {
view.SetStyleId (styleId);
}
if (!string.IsNullOrWhiteSpace (classId)) {
view.SetStyleClass(classId);
}
view.UpdateStylesNonRecursivelyAsync ();
}
public static void StyleOnHandlePropertyChanged (this NativeRenderer nr, object sender, PropertyChangedEventArgs e) {
if (e.PropertyName == "ClassId" || e.PropertyName == "StyleId") {
StyledRenderer.UpdateStyle (nr.Control, nr.Model);
}
}
public static void StyleOnModelSet (this NativeRenderer nr, VisualElement model) {
StyledRenderer.UpdateStyle (nr.Control, nr.Model);
}
}
public class StyledEntryRenderer : EntryRenderer
{
protected override void OnHandlePropertyChanged (object sender, PropertyChangedEventArgs e) {
base.OnHandlePropertyChanged (sender, e);
this.StyleOnHandlePropertyChanged (sender, e);
}
protected override void OnModelSet (VisualElement model) {
base.OnModelSet (model);
this.StyleOnModelSet (model);
}
}
public class StyledButtonRenderer : ButtonRenderer
{
protected override void OnHandlePropertyChanged (object sender, PropertyChangedEventArgs e) {
base.OnHandlePropertyChanged (sender, e);
this.StyleOnHandlePropertyChanged (sender, e);
}
protected override void OnModelSet (VisualElement model) {
base.OnModelSet (model);
this.StyleOnModelSet (model);
}
}
public class StyledLabelRenderer : LabelRenderer
{
protected override void OnHandlePropertyChanged (object sender, PropertyChangedEventArgs e) {
base.OnHandlePropertyChanged (sender, e);
this.StyleOnHandlePropertyChanged (sender, e);
}
protected override void OnModelSet (VisualElement model) {
base.OnModelSet (model);
this.StyleOnModelSet (model);
}
}
public class StyledImageRenderer : ImageRenderer
{
protected override void OnHandlePropertyChanged (object sender, PropertyChangedEventArgs e) {
base.OnHandlePropertyChanged (sender, e);
this.StyleOnHandlePropertyChanged (sender, e);
}
protected override void OnModelSet (VisualElement model) {
base.OnModelSet (model);
this.StyleOnModelSet (model);
}
}
public class StyledListViewRenderer : ListViewRenderer
{
protected override void OnHandlePropertyChanged (object sender, PropertyChangedEventArgs e) {
base.OnHandlePropertyChanged (sender, e);
this.StyleOnHandlePropertyChanged (sender, e);
}
protected override void OnModelSet (VisualElement model) {
base.OnModelSet (model);
this.StyleOnModelSet (model);
}
}
public class StyledViewCellRenderer : ViewCellRenderer
{
public override UITableViewCell GetCell (Cell item, UITableView tv)
{
var cell = base.GetCell (item, tv);
StyledRenderer.UpdateStyle (cell, item.StyleId, item.ClassId);
return cell;
}
}
public class StyledTextCellRenderer : TextCellRenderer
{
public override UITableViewCell GetCell (Cell item, UITableView tv)
{
var cell = base.GetCell (item, tv);
StyledRenderer.UpdateStyle (cell, item.StyleId, item.ClassId);
return cell;
}
}
public class StyledImageCellRenderer : ImageCellRenderer
{
public override UITableViewCell GetCell (Cell item, UITableView tv)
{
var cell = base.GetCell (item, tv);
StyledRenderer.UpdateStyle (cell, item.StyleId, item.ClassId);
return cell;
}
}
}
@jameymcelveen
Copy link
Author

OnModelSet has been deprecated in favor of OnElementChanged this needs to be switched out.

@lbarbier
Copy link

@jameymcelveen: This works great on iOS and I was wondering if you had a sample for Android.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment