Xamarin iOS CustomRenderer按钮背景突然无法正常工作

时间:2016-12-09 18:25:59

标签: xamarin xamarin.ios xamarin.forms

我有以下CustomRenderer将样式应用于我的跨平台Xamarin.Forms应用程序的iOS项目中的按钮。

该按钮用于具有圆角边缘,白色文本和蓝色渐变背景。

在下载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;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

好的,所以我终于弄明白了发生了什么。在我将每个layer.Frame设置为Control.Bounds值的LayoutSubviews方法中,我注意到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();
}

我不确定这是不是黑客,但它似乎做了这个工作 - 现在......