Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin iOS自定义渲染器按钮背景突然不工作_Xamarin_Xamarin.ios_Xamarin.forms - Fatal编程技术网

Xamarin iOS自定义渲染器按钮背景突然不工作

Xamarin iOS自定义渲染器按钮背景突然不工作,xamarin,xamarin.ios,xamarin.forms,Xamarin,Xamarin.ios,Xamarin.forms,我有以下CustomRenderer将样式应用于我的跨平台Xamarin.Forms应用程序的iOS项目中的按钮 该按钮过去具有圆形边缘、白色文本和蓝色渐变背景 在我下载Xcode 8.1之前,一切都很正常。由于移动到8.1,相同的代码将不会显示背景渐变。有人能看到我如何改变我的代码以使背景渐变重新工作吗 边框半径和文本颜色都像往常一样工作-只是缺少背景渐变 [assembly: ExportRenderer(typeof(CustomButton), typeof(CustomButtonRe

我有以下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;
            }
        }
    }
}
[程序集:ExportRenderer(typeof(CustomButton)、typeof(CustomButtonRenderer))]
命名空间MyApp.Forms.iOS.CustomRenders
{
类CustomButtonRenderer:ButtonRenderer
{
公共覆盖无效布局子视图()
{
foreach(控制中的var层?.layer.Sublayers.Where(layer=>layer为CAGradientLayer))
{
layer.Frame=Control.Bounds;
}
base.LayoutSubviews();
}
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(e.OldElement==null)
{
var梯度=新的CAGradientLayer();
gradient.CornerRadius=Control.Layer.CornerRadius=10;
gradient.Colors=新的CGColor[]
{
UIColor.FromRGB(153204255).CGColor,
UIColor.FromRGB(51102204).CGColor
};
var layer=Control?.layer.Sublayers.LastOrDefault();
控制?.Layer.insertsublayerblow(梯度,层);
Control.SetTitleColor(UIColor.White,UIControlState.Normal);
Control.Layer.BorderColor=UIColor.FromRGB(51102204).CGColor;
Control.Layer.BorderWidth=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();
}

我不确定这是否是一个黑客行为,但它似乎起到了作用-现在…

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

我不确定这是否是一个黑客行为,但它似乎起到了作用-目前…

从它看来,当您可以将
CornerRadius
应用到一个层时,Xcode 8可能已经发生了变化。该页面中的一个解决方案是在设置
转弯半径之前执行
控制.layoutifneed()
,以强制应用
控制的约束。尽管您可能希望将
布局fneed()
移动到
AwakeFromNib()覆盖范围内
如果您旋转手机/sim卡并向后旋转,是否会显示渐变?@sushingover是的,但它并不像预期的那样符合边界。@LaurenceFrost问题在于,此时添加
CAGradientLayer
不会导致布局无效。您可以尝试
layoutifneed
和/或
ForceLayout
等。。但我发现现在唯一正确的方法是对UIButton进行子类化,在其中执行自定义,并在渲染器中使用
SetNativeControl
来使用子类化的UIButton。@这听起来确实是一条路线。您没有我可以参考的代码示例或链接来帮助我吗?从它看来,当您可以将
CornerRadius
应用到图层时,Xcode 8可能已经更改。该页面中的一个解决方案是在设置
转弯半径之前执行
控制.layoutifneed()
,以强制应用
控制的约束。尽管您可能希望将
布局fneed()
移动到
AwakeFromNib()覆盖范围内
如果您旋转手机/sim卡并向后旋转,是否会显示渐变?@sushingover是的,但它并不像预期的那样符合边界。@LaurenceFrost问题在于,此时添加
CAGradientLayer
不会导致布局无效。您可以尝试
layoutifneed
和/或
ForceLayout
等。。但我发现现在唯一正确的方法是对UIButton进行子类化,在其中执行自定义,并在渲染器中使用
SetNativeControl
来使用子类化的UIButton。@这听起来确实是一条路线。你没有任何代码示例或链接我可以参考,以帮助我,你呢?