我在处理更大的项目时遇到过这个问题,但我已将其简化以证明问题。
我的View Controller中有一个UIView,它是方形和居中的:
现在,'比例高度'在这里很重要,因为如果高度或宽度设置为常数,则不会出现问题:
我希望此视图在手机上显示为一个漂亮的圆圈,因此我将其添加到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模拟器上启动应用程序,我得到了预期的结果:
但如果我不改变故事板中的“查看为”并在iPhone 6 Plus模拟器上启动,这就是我得到的:
当我将Storyboard更改为相应的屏幕时,它恢复正常:
我希望它只是一个模拟器错误,但在物理设备上启动时会出现同样的问题。因此,在部署应用程序时,用户可能会在开发时根据我为故事板选择的屏幕搞砸UI?
更新即可。我应该注意,向ViewController文件添加layoutIfNeeded()
可以解决问题:
override func viewDidLoad() {
super.viewDidLoad()
view.layoutIfNeeded()
centerView.layer.cornerRadius = centerView.frame.width / 2
}
但是,如果在应用程序启动时不管强制在哪个屏幕尺寸上,都不应该进行布局?
答案 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
}
}