Xamarin iOS自定义渲染器按钮背景突然不工作
我有以下CustomRenderer将样式应用于我的跨平台Xamarin.Forms应用程序的iOS项目中的按钮 该按钮过去具有圆形边缘、白色文本和蓝色渐变背景 在我下载Xcode 8.1之前,一切都很正常。由于移动到8.1,相同的代码将不会显示背景渐变。有人能看到我如何改变我的代码以使背景渐变重新工作吗 边框半径和文本颜色都像往常一样工作-只是缺少背景渐变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
[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。@这听起来确实是一条路线。你没有任何代码示例或链接我可以参考,以帮助我,你呢?