使用自动布局舍入视图?

Posted

技术标签:

【中文标题】使用自动布局舍入视图?【英文标题】:Rounding views with Auto Layout? 【发布时间】:2017-11-13 09:39:38 【问题描述】:

我想在使用自动布局时创建圆形视图,因此,我无法在视图中设置特定的半径值。

我以为我已经用下面的代码解决了这个问题,但是由于某种原因它在视图的第一次加载时没有执行,并且视图看起来是方形的,直到我推动屏幕的视图并将它带回来(例如提高键盘并降低它)。知道为什么或如何解决问题吗?

 override func viewWillLayoutSubviews() 
    self.myProfileView.userImage.layer.cornerRadius = self.myProfileView.userImage.frame.size.width * 0.5
    self.myProfileView.userImage.layer.borderWidth = 2
    self.myProfileView.userImage.layer.borderColor = UIColor().appThemeColour().cgColor

约束:

userImage.snp.makeConstraints  (make) -> Void in
            make.centerX.equalTo(self)
            make.centerY.equalTo(self).multipliedBy(0.25)
            userImage.heightAnchor.constraint(equalTo: userImage.widthAnchor).isActive = true
            userImage.widthAnchor.constraint(equalTo: self.widthAnchor, multiplier: 0.40).isActive = true
        

在首次加载时将视图推送到屏幕之前:

在我打开和关闭键盘后,将视图关闭并返回屏幕:

【问题讨论】:

【参考方案1】:

您应该改为在 viewDidLayoutSubviews 中运行舍入代码,该代码布局具有正确的框架之后运行。

另外,在访问其大小之前,为myProfileView 执行layoutIfNeeded()

override func viewDidLayoutSubviews() 
    myProfileView.layoutIfNeeded()

    myProfileView.userImage.layer.cornerRadius = myProfileView.userImage.frame.size.width * 0.5
    myProfileView.userImage.layer.borderWidth = 2
    myProfileView.userImage.layer.borderColor = UIColor().appThemeColour().cgColor

【讨论】:

我看到了你的逻辑,但不幸的是这也没有效果,问题仍然存在 尝试在这段代码之前运行myProfileView.layoutIfNeeded() 谢谢解决它,如果你能更新你的答案我投票成功 出于兴趣,我如何在 tableview 单元格内的视图上调用它? 您应该覆盖单元格的layoutSubviews 函数。 (别忘了一开始就打电话给super.layoutSubviews()。)

以上是关于使用自动布局舍入视图?的主要内容,如果未能解决你的问题,请参考以下文章

我们如何使用自动布局来舍入 UIImageView

为啥 iOS 自动布局会导致预 Retina 显示器出现明显的舍入错误(包括单元测试)

使用自动布局删除和重新添加子视图

使用自动布局居中模态视图

Xcode 6 - 另一个自动布局视图中的自动布局视图

我们可以将具有自动布局的 XIB 加载为以编程方式创建的没有自动布局的视图的子视图,并使用父视图调整子视图的大小吗?