如何根据superView设置UIView大小

How to set UIView size based on superView

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

视图需要在父视图的垂直和水平方向上居中。

因为 iAd,我想使用 originalContentView

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

在您的 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
            )
        ]
    )
}

这是我的最终解决方案

我定义了宽度和高度,然后从父视图中心减去它。并将其加载到 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)

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

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

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