Xcode 8以不同的方式设置帧大小.我如何找到更多细节?

Sim*_*lGy 6 uikit xcode8

在我的应用程序的几个地方,我得到零帧大小,我曾经得到一个框架.特别是在通过执行cornerRadius创建圆形对象时,这会影响我size/2.

例如,在Xcode 7中这很好用:

class AvatarUIButton: UIButton {
  required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    layer.masksToBounds = true
    layer.cornerRadius = bounds.size.width / 2
  }
}
Run Code Online (Sandbox Code Playgroud)

但现在在Xcode 8中,我必须这样做:

class AvatarUIButton: UIButton {
  override var bounds: CGRect { didSet {
    layer.cornerRadius = bounds.size.width / 2
  }}

  required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    self.layer.masksToBounds = true
  }
}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,变化可以说更好/更明显.我有另一种情况,在TableHeaderView上只涉及xcode 8的0帧不太孤立.

我正在寻找发布说明,邮件列表讨论或类似的讨论帧大小确定顺序的变化,以便我可以弄清楚改变了什么以及如何解决它.

PMI*_*MIW 2

在 Xcode 8 中,Apple 说:

Xcode 8 取消了配置视图的功能,而不受每个尺寸类别的框架变化的限制。使用 Xcode 8 编译后,在运行时切换大小类别时,没有约束的视图可能看起来会有所不同。接下来,使用设备栏的约束和自动调整大小蒙版来实现所需的布局。(25894544)

在以前版本的Xcode中,我们习惯在ViewDidLoad上定义设计。但在这里,没有创建不同的元素(也没有创建约束),因此视图是使用情节提要中的大小创建的。

现在,在 Xcode 8 中,我们不能再这样做了。我们需要有约束,因为框架没有初始化(这就是为什么你们中的一些人有这些框架大小值:0、0、1000、1000)。例如,将其放在 ViewDidAppear 中,它将正常工作。但是,您首先会几次看到没有圆角半径的按钮。

所以,你可以做的是使用这个函数(在 Objective C 中)(在你想要的地方,甚至在加载函数中):

[self performSelector:@selector(setCornerToMyButton) withObject:NULL afterDelay:0];
Run Code Online (Sandbox Code Playgroud)

你可以设置你想要的延迟,但即使是 0 也能工作。

并在此函数中更改半径,例如:

- (void) setCornerToMyButton {
    //Do what you want... 
    layer.masksToBounds = true
    layer.cornerRadius = bounds.size.width / 2
}
Run Code Online (Sandbox Code Playgroud)

希望对你有帮助。