Xcode 8 - 删除了一些按钮边框
Xcode 8 - Some buttons border removed
我刚刚将我的 Xcode 版本从 7.3 更新到 8.0,一些按钮边框消失了。
代码看起来不错,所以我真的不知道图层发生了什么。
顺便说一句 - 在其他一些控制器中我可以看到图层边框。
self.button.layer.borderColor = borderColor.CGColor;
self.button.layer.borderWidth = 2;
self.button.layer.cornerRadius = CGRectGetHeight(self.button.frame) / 2;
之前:(图片仅供参考 - 边框实时看起来不同)
现在:
我认为问题所在:
CGRectGetHeight(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;
原因是XCode 8引入了一种放大故事板的新方法。
在 XCode8 之前,在视图控制器生命周期中,frames
在 viewDidLoad(或属性 didSet
)中是未知的。您必须等到 viewDidLayoutSubviews(这是 Autolayout 完成应用约束以确定主视图中每个子视图的框架时。
但是 bounds
在此之前是可以访问的:它们只是设置为故事板中 IBOutlet 的大小。
在 XCode 8 中,情况有所不同:由于其新的缩放系统,甚至 bounds
在 ViewDidLayoutSubviews 之前也不正确(它们可能存在,但具有 1000 x 1000 等虚拟值)。
结论:
- 你可以在 viewDidLoad 或 IBOutlet 中使用诸如 cornerRadius 之类的东西
didSet,只要你用一个固定值
- 如果你需要根据
bounds
定义你的cornerRadius,那么在viewDidLayoutSubviews中这样做,或者使用NSLayoutConstraints(它们的值是固定的并且从 Autolayout 中知道)
- 如果您需要在 views 中使用 cornerRadius(如 UITableViewCell 或 UICollectionViewCell 子类),那么您可以在
layoutSubviews
中使用(但您需要提供cornerRadius 的固定值或 NSLayoutConstraint 常量)或 awakeFromNib
(在这种情况下,只需在执行任何与帧或边界相关的操作之前添加 self.layoutIfNeeded
,以强制单元格重新计算其子视图的框架)。
要强制计算视图框架,您可以尝试使用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。
我刚刚将我的 Xcode 版本从 7.3 更新到 8.0,一些按钮边框消失了。
代码看起来不错,所以我真的不知道图层发生了什么。 顺便说一句 - 在其他一些控制器中我可以看到图层边框。
self.button.layer.borderColor = borderColor.CGColor;
self.button.layer.borderWidth = 2;
self.button.layer.cornerRadius = CGRectGetHeight(self.button.frame) / 2;
之前:(图片仅供参考 - 边框实时看起来不同)
现在:
我认为问题所在:
CGRectGetHeight(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;
原因是XCode 8引入了一种放大故事板的新方法。
在 XCode8 之前,在视图控制器生命周期中,frames
在 viewDidLoad(或属性 didSet
)中是未知的。您必须等到 viewDidLayoutSubviews(这是 Autolayout 完成应用约束以确定主视图中每个子视图的框架时。
但是 bounds
在此之前是可以访问的:它们只是设置为故事板中 IBOutlet 的大小。
在 XCode 8 中,情况有所不同:由于其新的缩放系统,甚至 bounds
在 ViewDidLayoutSubviews 之前也不正确(它们可能存在,但具有 1000 x 1000 等虚拟值)。
结论:
- 你可以在 viewDidLoad 或 IBOutlet 中使用诸如 cornerRadius 之类的东西 didSet,只要你用一个固定值
- 如果你需要根据
bounds
定义你的cornerRadius,那么在viewDidLayoutSubviews中这样做,或者使用NSLayoutConstraints(它们的值是固定的并且从 Autolayout 中知道) - 如果您需要在 views 中使用 cornerRadius(如 UITableViewCell 或 UICollectionViewCell 子类),那么您可以在
layoutSubviews
中使用(但您需要提供cornerRadius 的固定值或 NSLayoutConstraint 常量)或awakeFromNib
(在这种情况下,只需在执行任何与帧或边界相关的操作之前添加self.layoutIfNeeded
,以强制单元格重新计算其子视图的框架)。
要强制计算视图框架,您可以尝试使用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。