2016-12-09 3 views
1

Ich habe den folgenden CustomRenderer, um einen Stil auf Schaltflächen in meinem iOS-Projekt meiner plattformübergreifenden Xamarin.Forms App anzuwenden.Xamarin iOS CustomRenderer Schaltflächenhintergrund funktioniert plötzlich nicht

Die Schaltfläche hatte abgerundete Kanten, weißen Text und einen blauen Hintergrund mit Farbverlauf.

Alles hat gut funktioniert, bis ich Xcode 8.1 heruntergeladen habe. Seit dem Wechsel zu 8.1 zeigt derselbe Code nicht mehr den Hintergrundgradienten. Kann jemand sehen, wie ich meinen Code ändern konnte, um den Hintergrundgradienten wieder zu arbeiten?

Der Rahmenradius und die Textfarbe funktionieren wie gewohnt - nur der Hintergrundgradient fehlt.

[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

Von [diesem Beitrag] (http://stackoverflow.com/a/39515254/3850012) sieht es so aus, als ob sich Xcode 8 geändert haben könnte, wenn Sie den 'CornerRadius' auf eine Ebene anwenden können. Eine Lösung von dieser Seite ist es, 'Control.LayoutIfNeeded()' zu setzen, bevor Sie Ihren 'CornerRadius' einstellen, um zu erzwingen, dass die' Control'-Bedingungen angewendet werden. Obwohl Sie die 'LayoutIfNeeded()' möglicherweise in eine Überschreibung von 'AwakeFromNib()' verschieben möchten – hvaughan3

+0

Wird der Farbverlauf angezeigt, wenn Sie das Telefon/SIM drehen und zurück drehen? – SushiHangover

+0

@SushiHangover Ja, das stimmt, aber es passt nicht so wie erwartet zu den Grenzen. –

Antwort

0

Ok, so habe ich endlich geklappt, was los war. In der LayoutSubviews-Methode, in der ich jeden Layer.Frame auf den Wert von Control.Bounds setzte, bemerkte ich, dass Control.Bounds ein Rechteck voller Nullen war, also war mein Farbverlauf daher 0 Pixel groß.

Ich habe das Verfahren wie folgt modifiziert und es funktioniert jetzt wie erwartet wieder:

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(); 
} 

Ich bin mir nicht sicher, ob dies ein Hack ist, aber es scheint, die Arbeit zu tun - jetzt ...

Verwandte Themen