iOS - Position UIView in center of superview using Auto Layout programmatically

后端 未结 2 1647
庸人自扰
庸人自扰 2020-12-08 07:24

How do you programmatically set a UIView to be in the center of its superview using Auto Layout?

UIButton* viewObj = [UIButton buttonWithType:UIButtonTypeRo         


        
2条回答
  •  粉色の甜心
    2020-12-08 08:03

    UIButton, UIImageView, UIlabel and UITextField can automatically set their size according to their content properties. The width and height of a UIImageView are set by the UIImage it may contain. The size of a UILabel will depend on its text. The width and height of a UIButton are defined by the title and the image it has (you can learn more about it with Intrinsic Content Size).

    Therefore, when you want to center a UIButton, a UILabel, a UITextField or a UIImageView inside a UIView with auto layout, in almost all cases you don't have to create constraints for their width and height. You simply need to set horizontal and vertical constraints for them.

    However, with auto layout, a UIView that has no subviews can't rely on anything to set its size unless you provide it some arbitrary width and height constraints. And according to your needs, you can solve this in 3 different ways.


    The pure auto layout style

    Here, we set the width and height of our UIView directly as auto layout constraints:

    override func viewDidLoad() {
        super.viewDidLoad()
    
        let newView = UIView()
        newView.backgroundColor = .redColor()
        newView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(newView)
    
        // Auto layout code using anchors (iOS9+)
        let horizontalConstraint = newView.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor)
        let verticalConstraint = newView.centerYAnchor.constraintEqualToAnchor(view.centerYAnchor)
        let widthConstraint = newView.widthAnchor.constraintEqualToAnchor(nil, constant: 100)
        let heightConstraint = newView.heightAnchor.constraintEqualToAnchor(nil, constant: 100)
        NSLayoutConstraint.activateConstraints([horizontalConstraint, verticalConstraint, widthConstraint, heightConstraint])
    }
    

    The autoresizing mask style

    Here, we initialize our UIView with its width and height, make its center and its superview's center equal and create some autoresizing masks. Then, we ask UIKit to translate those autoresizing masks into auto layout constraints:

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let newView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 100.0, height: 100.0))
        newView.backgroundColor = .redColor()
        
        newView.center = CGPointMake(view.bounds.midX, view.bounds.midY)
        newView.autoresizingMask = [.FlexibleLeftMargin, .FlexibleRightMargin, .FlexibleTopMargin, .FlexibleBottomMargin]
    
        newView.translatesAutoresizingMaskIntoConstraints = true // default is true
        view.addSubview(newView)
    }
    

    The subclass style

    Here, we create a subclass of UIView and override its intrinsicContentSize() method (declaration) so that it returns the desired size:

    import UIKit
    
    class CustomView: UIView {
        override func intrinsicContentSize() -> CGSize {
            return CGSize(width: 100, height: 100)
        }
    }
    
    class ViewController: UIViewController {
        
        override func viewDidLoad() {
            super.viewDidLoad()
            
            let newView = CustomView()
            newView.backgroundColor = .redColor()
            newView.translatesAutoresizingMaskIntoConstraints = false
            view.addSubview(newView)
            
            let horizontalConstraint = NSLayoutConstraint(item: newView,
                attribute: .CenterX,
                relatedBy: .Equal,
                toItem: view,
                attribute: .CenterX,
                multiplier: 1,
                constant: 0)
            view.addConstraint(horizontalConstraint)
            let verticalConstraint = NSLayoutConstraint(item: newView,
                attribute: .CenterY,
                relatedBy: .Equal,
                toItem: view,
                attribute: .CenterY,
                multiplier: 1,
                constant: 0)
            view.addConstraint(verticalConstraint)
        }
        
    }
    

提交回复
热议问题