Xamarin iOS中UIButton设置图片忽略自身边界超出frame如何解决
问题根因
你之前的尝试无效主要是3个低级错误导致:
UIImage的Scale、CreateResizableImage都是返回新实例的方法,你调用后没有把返回值赋值给变量,原始图片没有发生任何修改,相当于这部分代码完全没生效ViewDidLoad阶段Auto Layout约束还没有完成计算,此时拿到的Btn.Frame是故事板的设计时尺寸,不是运行时的实际渲染尺寸,用这个值缩放图片自然不符合预期- 没有开启按钮的
ClipsToBounds属性,超出按钮边界的图片内容不会被裁剪,视觉上就会呈现出图片撑满屏幕的效果
修复方案
最简单的方案不需要手动缩放图片,只要补充缺少的属性配置即可:
public override void ViewDidLoad() { base.ViewDidLoad(); // 开启边界裁剪,超出按钮的内容不会显示 Btn.ClipsToBounds = true; // 仅需要修改按钮内部ImageView的ContentMode,按钮本身的ContentMode不影响图片展示 Btn.ImageView.ContentMode = UIViewContentMode.ScaleAspectFit; // 直接设置图片即可,UIKit会自动按照ContentMode适配按钮尺寸 Btn.SetImage(UIImage.FromBundle("skip"), UIControlState.Normal); }
如果需要手动控制图片缩放适配,需要在布局完成的生命周期方法中获取正确的按钮尺寸:
public partial class ViewController : UIViewController { private bool _isFirstLayout = true; public ViewController(IntPtr handle) : base(handle) { } public override void ViewDidLoad() { base.ViewDidLoad(); Btn.ClipsToBounds = true; Btn.ImageView.ContentMode = UIViewContentMode.ScaleAspectFit; } // Auto Layout完成约束计算后会触发这个方法 public override void ViewDidLayoutSubviews() { base.ViewDidLayoutSubviews(); if (_isFirstLayout) { _isFirstLayout = false; var originalImg = UIImage.FromBundle("skip"); // 接收Scale方法返回的缩放后新图片实例,第二个参数用屏幕Scale保证图片清晰度 var scaledImg = originalImg.Scale(new CGSize(Btn.Bounds.Width, Btn.Bounds.Height), UIScreen.MainScreen.Scale); Btn.SetImage(scaledImg, UIControlState.Normal); } } }
内容的提问来源于stack exchange,提问作者ben_bekir
相关产品推荐
相关产品推荐

