我刚刚将我的Xcode ver从7.3更新到8.0,并且一些按钮边框消失了。
代码看起来很好,所以我真的不知道层发生了什么。 顺便说一句 - 在其他一些控制器中我可以看到图层边框。
self.button.layer.borderColor = borderColor.CGColor;
self.button.layer.borderWidth = 2;
self.button.layer.cornerRadius = CGRectGetHeight(self.button.frame) / 2;
之前的:(图像只是例如 - 边框实时看起来不同)
现在:
答案 0 :(得分:16)
原因是XCode 8引入了一种放大Storyboard的新方法。
在XCode 8之前,在视图控制器生命周期中,viewDidLoad(或属性frames
)中不知道didSet
。您必须等到viewDidLayoutSubviews(这是Autolayout完成应用约束以确定主视图中每个子视图的帧的时间。
但在此之前可以访问bounds
:它们只是设置为故事板中IBOutlet的大小。
在XCode 8中,情况有所不同:由于新的缩放系统,即使bounds
在ViewDidLayoutSubviews之前也不正确(它们可能存在,但虚拟值如1000 x 1000)。
总结:
bounds
定义你的cornerRadius,那么在viewDidLayoutSubviews 中这样做,或者使用 NSLayoutConstraints (它们的值是固定的并且可以从Autolayout中获知)layoutSubviews
中执行此操作(但是您需要提供固定值或一个NSLayoutConstraint常量到cornerRadius),或者在awakeFromNib
中(在这种情况下,只需在执行任何与帧或boounds相关的操作之前添加self.layoutIfNeeded
,以强制单元重新计算其子视图框架)。答案 1 :(得分:4)
我认为问题在于:
CGRectGetHeight(self.button.frame) / 2;
当你设置角落时我认为高度按钮没有价值或价值到更大的边界将不会显示。您可以尝试将其更改为
self.button.layer.cornerRadius = 15;
如果有效,我认为您可以检查逻辑并在高度按钮获得正确值时进行设置。
答案 2 :(得分:2)
试试这个并检查:
#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;
答案 3 :(得分:0)
要强制计算视图框,可以尝试使用layoutIfNeeded。 例如,对于UITableViewCell中的标签:
override func awakeFromNib() {
super.awakeFromNib()
self.layoutIfNeeded()
self.qualityIndexLabel.makeRound()
}
答案 4 :(得分:0)
使用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; });
答案 5 :(得分:-1)
不推荐使用ROUNDRect,而是使用UIButtonTypeSystem。 有关详细信息,请参阅https://developer.apple.com/reference/uikit/uibutton?language=objc。