我有以下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;
}
}
}
}
答案 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();
}
我不确定这是不是黑客,但它似乎做了这个工作 - 现在......