使用比例约束会导致不同屏幕尺寸的毛刺

时间:2017-11-10 17:03:06

标签: ios xcode autolayout constraints

我在处理更大的项目时遇到过这个问题,但我已将其简化以证明问题。

我的View Controller中有一个UIView,它是方形和居中的:

enter image description here enter image description here

现在,'比例高度'在这里很重要,因为如果高度或宽度设置为常数,则不会出现问题:

enter image description here

我希望此视图在手机上显示为一个漂亮的圆圈,因此我将其添加到ViewController.swift并提供cornerRadius以查看layer

class ViewController: UIViewController {

    @IBOutlet weak var centerView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        centerView.layer.cornerRadius = centerView.frame.width / 2
    }

}

在我的故事板中,我将“查看为”设置为iPhone SE并在iPhone SE模拟器上启动应用程序,我得到了预期的结果:

enter image description here enter image description here

但如果我不改变故事板中的“查看为”并在iPhone 6 Plus模拟器上启动,这就是我得到的:

enter image description here enter image description here

当我将Storyboard更改为相应的屏幕时,它恢复正常:

enter image description here enter image description here

我希望它只是一个模拟器错误,但在物理设备上启动时会出现同样的问题。因此,在部署应用程序时,用户可能会在开发时根据我为故事板选择的屏幕搞砸UI?

更新即可。我应该注意,向ViewController文件添加layoutIfNeeded()可以解决问题:

override func viewDidLoad() {
    super.viewDidLoad()
    view.layoutIfNeeded()
    centerView.layer.cornerRadius = centerView.frame.width / 2
}

但是,如果在应用程序启动时不管强制在哪个屏幕尺寸上,都不应该进行布局?

1 个答案:

答案 0 :(得分:1)

视图可以经常更改大小。如果您在.cornerRadius中设置viewDidLoad(),则在视图更改时不会反映出来。

将子类化UIView

会好得多
class RoundedView: UIView {
    override func layoutSubviews() {
        self.layer.cornerRadius = self.bounds.size.height / 2.0
    }
}

并且,您可以轻松地使其“可设计”,以便在故事板中进行布局时看到“圆形视图”:

@IBDesignable
class RoundedView: UIView {
    override func layoutSubviews() {
        self.layer.cornerRadius = self.bounds.size.height / 2.0
    }
}