Xcode 8 – 删除了一些button边框
我只是将我的Xcode ver从7.3更新到8.0,一些button边框消失了。
代码看起来很好,所以我真的不知道这些图层发生了什么。 顺便说一句 – 在其他一些控制器,我可以看到图层的边界。
self.button.layer.borderColor = borderColor.CGColor; self.button.layer.borderWidth = 2; self.button.layer.cornerRadius = CGRectGetHeight(self.button.frame) / 2;
之前:(图像只是例如 – 实时边界看起来不同)
现在:
原因是XCode 8引入了一种放大Storyboard的新方法。
在XCode 8之前,在视图控制器生命周期中,viewDidLoad(或属性didSet
)中的frames
是未知的。 你必须等到viewDidLayoutSubviews(这是Autolayout完成应用约束来确定主视图中每个子视图的框架的时候,但是之前的bounds
是可以访问的:它们被设置为故事板中的IBOutlet的大小。
在XCode 8中,事情是不同的:由于他们的新的缩放系统,即使bounds
在ViewDidLayoutSubviews(它们可能存在,但是具有诸如1000 x 1000的虚拟值)之前是不正确的。
结论是 :
- 您可以在viewDidLoad或IBOutlet didSet中使用诸如cornerRadius之类的东西,只要您使用固定值
- 如果你需要根据
bounds
来定义你的cornerRadius,那么在viewDidLayoutSubviews中做 ,或者使用NSLayoutConstraints (它们的值是固定的,从Autolayout知道的) - 如果您需要在视图中使用cornerRadius(如UITableViewCell或UICollectionViewCell子类),则可以在
layoutSubviews
(但需要为cornerRadius提供一个固定值或NSLayoutConstraint常量),或者在awakeFromNib
(在这种情况下,只要在执行任何frame-or boounds相关的self.layoutIfNeeded
之前添加self.layoutIfNeeded
,以强制单元格重新计算其子视图的框架)。
我觉得在这个问题上:
CGRectGetHeight(self.button.frame) / 2;
当你设置angular落,我认为高度button没有价值或价值较大的边界将不显示。 你可以尝试改变它
self.button.layer.cornerRadius = 15;
如果工作,我认为你可以检查你的逻辑,并设置它时,高度button得到正确的价值。
试试这个,并检查:
#import <QuartzCore/QuartzCore.h> self.button.layer.borderColor = [UIColor whiteColor].CGColor; self.button.layer.borderWidth = 2; self.button.layer.cornerRadius = 5; // Change this value on your requirement self.button.clipsToBounds = YES;
要强制计算视图框架,您可以尝试使用layoutIfNeeded。 例如,对于UITableViewCell中的标签:
override func awakeFromNib() { super.awakeFromNib() self.layoutIfNeeded() self.qualityIndexLabel.makeRound() }
使用dispatch_after
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.8 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ self.button.layer.borderColor = borderColor.CGColor; self.button.layer.borderWidth = 2; self.button.layer.cornerRadius = CGRectGetHeight(self.button.frame) / 2; });
RoundedRect不推荐使用UIButtonTypeSystem来代替。 有关更多信息,请参阅https://developer.apple.com/reference/uikit/uibutton?language=objc 。