使用比例约束会导致不同屏幕尺寸出现故障

Posted

技术标签:

【中文标题】使用比例约束会导致不同屏幕尺寸出现故障【英文标题】:Using proportional constraints results in glitches on different screen sizes 【发布时间】:2017-11-10 17:03:05 【问题描述】:

我在处理一个更大的项目时遇到了这个问题,但我已经简化了它来演示这个问题。

我的视图控制器中有一个 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
    


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

但如果我不更改 Storyboard 中的“查看方式”并在 iPhone 6 Plus 模拟器上启动,我会得到以下结果:

当我将 Storyboard 切换到相应的屏幕时,它又恢复了正常:

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

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

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

但是无论在哪种屏幕尺寸上,应用启动时不应该强制布局吗?

【问题讨论】:

centerView.layer.cornerRadius = centerView.frame.width / 2 移动到viewDidLayoutSubviews。在viewDidLoad 中,视图的大小将是它在情节提要或xib 中的大小。 viewDidLayoutSubviews 在视图框架更新后调用。 【参考方案1】:

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

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
    

【讨论】:

以上是关于使用比例约束会导致不同屏幕尺寸出现故障的主要内容,如果未能解决你的问题,请参考以下文章

不同屏幕尺寸的 iOS 缩放约束

使用动态rem方案适配不同屏幕尺寸

如何为不同的屏幕尺寸创建具有自动布局的比例视图?

为啥屏幕分辨率和屏幕尺寸比例不一样?

Android 屏幕适配屏幕适配通用解决方案 ⑥ ( 约束布局 ConstraintLayout 百分比布局方案 | 将设计稿尺寸自动转为约束布局百分比标签属性 | 将输出结果设置到组件标签中 )

Android 屏幕适配屏幕适配通用解决方案 ⑥ ( 约束布局 ConstraintLayout 百分比布局方案 | 将设计稿尺寸自动转为约束布局百分比标签属性 | 将输出结果设置到组件标签中 )