【发布时间】:2017-04-25 07:12:44
【问题描述】:
我有以下 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;
}
}
}
}
【问题讨论】:
-
从this post 看来,当您可以将
CornerRadius应用于图层时,Xcode 8 可能已经发生了变化。该页面的一个解决方案是在设置CornerRadius之前执行Control.LayoutIfNeeded()以强制应用Control的约束。尽管您可能希望将LayoutIfNeeded()移动到AwakeFromNib()的覆盖范围内 -
如果您旋转手机/SIM卡并旋转回来,渐变是否会显示?
-
@SushiHangover 是的,它确实如此,但它并不像预期的那样符合边界。
-
@LaurenceFrost 问题在于此时添加
CAGradientLayer不会导致布局无效。您可以尝试LayoutIfNeeded和/或ForceLayout等。但我发现现在唯一可以正常工作的是子类化一个UIButton,在其中执行您的自定义并在您的渲染器中使用SetNativeControl来使用您的子类化UIButton . -
@SushiHangover 听起来这绝对是要走的路。您碰巧没有任何代码示例或链接可以参考以帮助我吗?
标签: xamarin xamarin.ios xamarin.forms