如何根据superView设置UIView大小

Posted

技术标签:

【中文标题】如何根据superView设置UIView大小【英文标题】:How to set UIView size based on superView 【发布时间】:2015-03-15 17:04:39 【问题描述】:

我正在寻找相对于 superView 调整 UIView 的大小。

视图需要垂直和水平居中于超级视图。

因为 iAd 我想使用 originalContentView

@IBOutlet var WhiteBar: UIView!    
WhiteBar.frame = CGRect(origin: MainView.center, size: CGSize(width: 280, height: 280))

【问题讨论】:

为什么不使用自动布局 我花了很多时间打架,但这只是一种痛苦。因为我希望这些视图根据屏幕大小而变化。 我非常喜欢使用 SB 做任何事情,但即使是我也不得不放弃。如果 Eric Gu 在这里,他会感到震惊! 【参考方案1】:

在你的 viewController 中创建一个函数,它接受一个视图、一个设置的高度和一个设置的宽度作为参数,并将以下 NSLayoutConstraints 添加到视图的父视图中。您必须在您的视图已附加到超级视图后调用此函数,否则它将不起作用。

func center(v: UIView, width: CGFloat, height: CGFloat) 
    v.setTranslatesAutoresizingMaskIntoConstraints(false)
    v.superview?.addConstraints(
        [
            NSLayoutConstraint(
                item: v,
                attribute: .CenterX,
                relatedBy: .Equal,
                toItem: v.superview,
                attribute: .CenterX,
                multiplier: 1,
                constant: 0
            ),
            NSLayoutConstraint(
                item: v,
                attribute: .CenterY,
                relatedBy: .Equal,
                toItem: v.superview,
                attribute: .CenterY,
                multiplier: 1,
                constant: 0
            ),
            NSLayoutConstraint(
                item: v,
                attribute: .Height,
                relatedBy: .Equal,
                toItem: nil,
                attribute: .NotAnAttribute,
                multiplier: 1,
                constant: height
            ),
            NSLayoutConstraint(
                item: v,
                attribute: .Width,
                relatedBy: .Equal,
                toItem: nil,
                attribute: .NotAnAttribute,
                multiplier: 1,
                constant: width
            )
        ]
    )

【讨论】:

哇,这是怎么回事?我不能只使用超级视图的原点作为我的中心并给它一个宽度和高度吗? 使用我的代码,我可以根据屏幕尺寸将其设置为正确的尺寸,但它没有居中 这是自动布局。它将您的子视图的所有边缘连接到您的超级视图,因此无论您的超级视图有多大,它总是一样大。 你的意思是居中吗?你的问题有错字。我将使用正确的约束进行更新 我没有关注。我希望相对于超级视图输入我的视图,但根据屏幕尺寸不同尺寸。我得到了第二部分,现在我只需要将它居中。【参考方案2】:

您可以使用 Autolayout(请参阅其他答案)或使用 struts:要使用相对框架,最好使用 viewWillLayoutSubviews。希望对您有所帮助。

override func viewWillLayoutSubviews() 
        customSubView.center.x = view.center.x
    

【讨论】:

谢谢,我的代码可以运行了,和你说的很相似【参考方案3】:

这是我的最终解决方案

我定义了宽度和高度,然后从超级视图中心减去它。并在 viewDidLayoutSubviews() 中加载它

        var Width: CGFloat = 280
        var Height: CGFloat = 280
        WhiteBar.frame = CGRect(x: (self.originalContentView.center.x - (Width / 2)), y: (self.originalContentView.center.y - (Height / 2)), width: Width, height: Height)

这也会根据方向调整视图。

【讨论】:

以上是关于如何根据superView设置UIView大小的主要内容,如果未能解决你的问题,请参考以下文章

当superView frameWidth 发生变化时,UIView 不会自动调整大小

如何根据iOS中superview的大小制作UIButton网格?

将两个不同大小的 UIView 水平居中

根据内容大小设置 UIView 的大小

Swift - 根据大小屏幕设置 UIView 的大小

防止子视图在其 Superview 转换时进行转换