【问题标题】:Xamarin iOS CustomRenderer button background suddenly not workingXamarin iOS CustomRenderer 按钮背景突然无法正常工作
【发布时间】: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


【解决方案1】:

好的,所以我终于弄清楚发生了什么。在 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();
}

我不确定这是否是一个 hack,但它似乎可以完成这项工作 - 现在......

【讨论】:

    猜你喜欢
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多