原因是XCode 8引入了一种新的在Storyboard中缩放的方式。
XCode 8之前,在视图控制器的生命周期中,frames
在viewDidLoad(或属性didSet
)中是不可知的。你必须等到viewDidLayoutSubviews(当自动布局完成应用约束以确定主视图中每个子视图的框架时)才能确定它们。
但bounds
在此之前是可以访问的:它们只是设置为Storyboard中IBOutlet的大小。
在XCode 8中,情况有所不同:由于其新的缩放系统,甚至在ViewDidLayoutSubviews之前,bounds
也不正确(它们可能存在,但具有像1000 x 1000这样的虚拟值)。
总之:
bounds
定义您的cornerRadius,则在viewDidLayoutSubviews中进行,或使用NSLayoutConstraint(其值是从Autolayout固定且已知的)。self.layoutIfNeeded
,以强制单元格重新计算其子视图的框架即可)。awakeFromNib
和init?(coder aDecoder: NSCoder)
在Xcode 8中也显示虚拟的1000x1000帧大小,尽管在Xcode 7中可以正常工作。 - CrashalotCGRectGetHeight(self.button.frame) / 2;
当您设置角落时,我认为高度按钮没有值或值太大,边框将不会显示。您可以尝试更改为
self.button.layer.cornerRadius = 15;
试一下并检查:
#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;
使用 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; });
为了强制计算视图框架,您可以尝试使用layoutIfNeeded。例如,在UITableViewCell中的标签:
override func awakeFromNib() {
super.awakeFromNib()
self.layoutIfNeeded()
self.qualityIndexLabel.makeRound()
}
RoundedRect已被弃用,请改用UIButtonTypeSystem。有关更多信息,请参见https://developer.apple.com/reference/uikit/uibutton?language=objc。