2016-09-14 34 views
8

我刚刚将我的Xcode ver从7.3更新为8.0,并且一些按钮边框消失了。Xcode 8 - 删除了一些按钮边框

该代码看起来不错,所以我真的不知道发生了什么图层。 btw - 在其他一些控制器中,我可以看到图层边框。

self.button.layer.borderColor = borderColor.CGColor; 
self.button.layer.borderWidth = 2; 
self.button.layer.cornerRadius = CGRectGetHeight(self.button.frame)/2; 

前:(图像仅是例如 - 边界看起来不一样实时)

before:

现在

now:

+1

在最后尝试这一行:self.button.clipsToBounds = YES –

+0

令人惊讶的是,即使您的按钮之前的圆角半径似乎不是按钮高度的一半。 –

+0

该图片仅作为例子... –

回答

16

的原因是,XCode的8引入了故事板放大了新的途径。

在XCode 8之前,在视图控制器生命周期中,frames在viewDidLoad(或属性didSet)中是未知的。你必须等到viewDidLayoutSubviews(这是Autolayout完成应用约束来确定主视图中每个子视图的帧的时候)。 但之前可以访问bounds:它们只设置为故事板中IBOutlet的大小。

在Xcode 8,情况就不同了:由于其新的变焦系统,即使在bounds是不正确的前ViewDidLayoutSubviews(它们可能存在,但与像1000×1000虚拟值)

结论:

  • 你可以使用这样的t hings为cornerRadius在viewDidLoad中或在IBOutlet中 didSet,只要您使用固定值
  • ,如果你需要根据bounds来定义你的cornerRadius,然后在viewDidLayoutSubviews这样做,或者使用NSLayoutConstraints(他们的价值是固定的,并从自动布局知)
  • ,如果您需要在意见(像的UITableViewCell或UICollectionViewCell子类使用cornerRadius),那么你可以在layoutSubviews这样做(但你需要给一个固定值或一个NSLayoutConstraint常量到cornerRadius),或者在012中(在这种情况下,为了强制单元格重新计算其子视图的框架,在做任何与框架或边界相关的事情之前,只需添加self.layoutIfNeeded)。
+0

1000 x 1000 - 它正是我看到的造成问题的虚拟框架。现在,当你的答案很好 - 我将更好地知道下一次如何处理它:) –

+1

如此令人沮丧的是,浪费这么多时间来调试它!感谢分享。 – Crashalot

+0

viewDidLayoutSubviews用于加载Storyboard中构建的自定义视图的类似功能是什么? 'awakeFromNib'和'init?(coder aDecoder:NSCoder)'在Xcode 8中也显示虚拟的1000x1000帧大小,尽管这在Xcode 7中有效。 – Crashalot

4

我觉得问题在它:

CGRectGetHeight(self.button.frame)/2; 

当你设置角落我认为高度按钮没有价值或价值较大的边界将不会显示。你可以尝试将其更改为

self.button.layer.cornerRadius = 15; 

如果工作,我想你可以检查你的逻辑,并设置在高度按钮得到正确的值。

+0

但它工作,直到昨天当我与Xcode 7 :) –

+0

我明白了。但现在你使用xcode8和ios 10,所以改变了一些东西。 –

+0

所以这就是问题所在。在Xcode 7 CGRectGetHeight(self.button.frame)/ 2工作得很好,但现在由于某种原因,我必须将高度约束添加到此按钮并将其拆分为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; 
0

要强制计算视图框架,可以使用layoutIfNeeded进行尝试。 例如,对于在一个UITableViewCell标签:

override func awakeFromNib() { 
    super.awakeFromNib() 
    self.layoutIfNeeded() 
    self.qualityIndexLabel.makeRound() 
} 
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; });