设置UIButton圆角后在小屏设备显示生硬问题求助
问题原因分析与解决方案
哈哈,这个坑我当年刚做iOS开发时踩过好多次!问题核心出在你设置圆角的时机不对——ViewDidLoad阶段,按钮的真实布局还没完成呢!
为什么小屏设备会出现生硬圆角?
当ViewDidLoad执行时,视图控制器只是完成了视图结构的加载,Auto Layout还没来得及根据当前设备的屏幕尺寸计算出按钮的最终frame。你这时候拿到的self.myBtn.frame.size.height,其实是你在XIB/Storyboard里设置的初始参考尺寸(比如可能是按iPhone X的尺寸绘制的)。但到了iPhone SE这类小屏设备,按钮的实际高度会被Auto Layout自动调整,可你已经提前用旧的高度值算出了圆角半径,自然圆角比例就不对,看起来生硬突兀。
解决方案:换个正确的时机设置圆角
1. 最直接的修复:移到viewDidLayoutSubviews方法
这个方法是系统在所有布局计算完成后调用的,每次屏幕旋转、视图尺寸变化时也会触发,在这里取到的按钮frame是绝对准确的:
override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() // 这里拿到的height是当前设备上按钮的真实高度 self.myBtn.layer.cornerRadius = self.myBtn.frame.size.height / 2 self.myBtn.layer.masksToBounds = true }
2. 更优雅的方式:自定义圆角按钮子类
如果项目里有大量需要圆形圆角的按钮,直接写个UIButton子类,一劳永逸适配所有设备:
class CircularButton: UIButton { override func layoutSubviews() { super.layoutSubviews() // 布局完成后自动设置为圆形圆角 layer.cornerRadius = bounds.height / 2 layer.masksToBounds = true } }
之后在XIB/Storyboard里把按钮的类改成CircularButton,或者代码里直接初始化这个类,就不用每次手动设置圆角了。
3. 不推荐的临时方案:layoutIfNeeded()
有些同学会想到在ViewDidLoad里先调用self.view.layoutIfNeeded()再设置圆角,虽然偶尔能生效,但这个方法会强制提前触发布局,可能带来不必要的性能开销,遇到复杂嵌套布局时仍可能出现frame不准确的问题,不如viewDidLayoutSubviews靠谱。
内容的提问来源于stack exchange,提问作者FS.O6
相关产品推荐
相关产品推荐

