2016-12-09 2 views
1

У меня есть следующий CustomRenderer, чтобы применить стиль к кнопкам в моем проекте iOS моего кросс-платформенного приложения Xamarin.Forms.Xamarin iOS CustomRenderer кнопка фона внезапно не работает

Кнопка имела закругленные края, белый текст и синий фон градиента.

Все работает нормально, пока я не загрузил Xcode 8.1. Начиная с перехода к 8.1, тот же код не будет представлять собой градиент фона. Может ли кто-нибудь увидеть, как я могу изменить свой код, чтобы снова получить фоновый градиент?

Радиус границ и цвет текста работают как обычно - это просто отсутствующий градиент фона.

[assembly: ExportRenderer(typeof(CustomButton), typeof(CustomButtonRenderer))] 
namespace MyApp.Forms.iOS.CustomRenderers 
{ 
    class CustomButtonRenderer : ButtonRenderer 
    { 
     public override void LayoutSubviews() 
     { 
      foreach (var layer in Control?.Layer.Sublayers.Where(layer => layer is CAGradientLayer)) 
      { 
       layer.Frame = Control.Bounds; 
      } 

      base.LayoutSubviews(); 
     } 

     protected override void OnElementChanged(ElementChangedEventArgs<Button> e) 
     { 
      base.OnElementChanged(e); 

      if (e.OldElement == null) 
      { 
       var gradient = new CAGradientLayer(); 
       gradient.CornerRadius = Control.Layer.CornerRadius = 10; 
       gradient.Colors = new CGColor[] 
       { 
        UIColor.FromRGB(153, 204, 255).CGColor, 
        UIColor.FromRGB(51, 102, 204).CGColor 
       }; 
       var layer = Control?.Layer.Sublayers.LastOrDefault(); 

       Control?.Layer.InsertSublayerBelow(gradient, layer); 
       Control.SetTitleColor(UIColor.White, UIControlState.Normal); 

       Control.Layer.BorderColor = UIColor.FromRGB(51, 102, 204).CGColor; 
       Control.Layer.BorderWidth = 1; 
      } 
     } 
    } 
} 
+0

Из [this post] (http://stackoverflow.com/a/39515254/3850012) похоже, что Xcode 8, возможно, изменился, когда вы можете применить 'CornerRadius' к слою. Одним из решений этой страницы является выполнение 'Control.LayoutIfNeeded()' перед установкой 'CornerRadius' для принудительного применения ограничений' Control'. Хотя вы можете переместить 'LayoutIfNeeded()' в пределах переопределения 'AwakeFromNib()' – hvaughan3

+0

Появляется ли градиент, если вы вращаете телефон/сим и вращаетесь назад? – SushiHangover

+0

@SushiHangover да, но это не соответствует границам, как ожидалось. –

ответ

0

Хорошо, поэтому я наконец-то разработал, что происходит. В методе LayoutSubviews, где я устанавливал каждый layer.Frame значение Control.Bounds, я заметил, что Control.Bounds был прямоугольником, полным нулей, поэтому мой градиент был поэтому размером 0 пикселей.

Я модифицировал метод следующим образом, и теперь он работает, как ожидается, снова:

public override void LayoutSubviews() 
{ 
    var newBounds = Element.Bounds.ToRectangleF(); 
    foreach (var layer in Control?.Layer.Sublayers.Where(layer => layer is CAGradientLayer)) 
    { 
     layer.Frame = new CGRect(0, 0, newBounds.Width, newBounds.Height); 
    } 

    base.LayoutSubviews(); 
} 

Я не уверен, если это хак, но это, кажется, делает эту работу - на данный момент ...

Смежные вопросы