Xcode 8 - 删除了一些按钮边框

Asi*_*ati 8 iphone xcode uibutton ios xcode8

我刚刚将我的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;
Run Code Online (Sandbox Code Playgroud)

之前:(图像只是例如 - 边框实时看起来不同)

之前:

现在:

现在:

Fré*_*dda 16

原因是XCode 8引入了一种放大Storyboard的新方法.

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

在XCode 8中,情况有所不同:由于他们的新缩放系统,甚至bounds在ViewDidLayoutSubviews之前都不正确(它们可能存在,但具有1000 x 1000的虚拟值).

结论 :

  • 你可以在viewDidLoad或IBOutlet didSet中使用cornerRadius之类的东西,只要你使用固定值
  • 如果你需要定义你的cornerRadius bounds,那么在viewDidLayoutSubviews中这样做,或者使用NSLayoutConstraints(它们的值是固定的并且可以从Autolayout中获知)
  • 如果你需要在视图中使用cornerRadius (比如UITableViewCell或UICollectionViewCell子类),那么你可以这样做layoutSubviews(但是你需要给一个固定值或一个NSLayoutConstraint常量给cornerRadius),或者在awakeFromNib(在这种情况下,只是self.layoutIfNeeded在执行任何与帧相关或与boounds相关的操作之前添加,以强制单元格重新计算其子视图的帧.