Programmatically creating constraints bound to view controller margins

前端 未结 3 1254
广开言路
广开言路 2020-12-08 21:32

I\'m trying to make a view that will act as a sort of \"panel\", attached to the right side of the view controller.

That is, it is bound to the trailing, top, and b

3条回答
  •  南笙
    南笙 (楼主)
    2020-12-08 21:47

    In your example code above, it seems like you are mixing up view and myView in a few places. In any event, widthConstraint should be added to myView and topConstraint, trailingConstraint, and bottomConstraint should be added to self.view. The reason for this is constraints must be added to the closest superview ancestor that lays out both views involved in the constraint. In the case where you are constraining a child view attribute to an attribute on its parent view, the constraint must be added to the parent view, since it lays out both itself and the child view. If you have a constraint between two sibling views, the constraint would be added to their parent view, since it is the closest ancestor that lays out both the views involved.

    If you're able to target iOS 9.0 and above, it's much cleaner and easier to use the new NSLayoutAnchor and NSLayoutDimension API for creating these kinds of constraints. It also provides strict type checking and the compiler can verify correctness. With these new APIs, your example code would simply become:

    let myView = UIView()
    myView.backgroundColor = UIColor.redColor()
    self.view.addSubview(myView)
    
    let margins = self.view.layoutMarginsGuide
    myView.trailingAnchor.constraintEqualToAnchor(margins.trailingAnchor).active = true
    myView.topAnchor.constraintEqualToAnchor(margins.topAnchor).active = true
    myView.bottomAnchor.constraintEqualToAnchor(margins.bottomAnchor).active = true
    myView.widthAnchor.constraintEqualToConstant(300.0).active = true
    

    No need to explicitly add the constraints to the right view, etc. You can read more about this method of creating constraints here:

    https://developer.apple.com/library/ios/documentation/AppKit/Reference/NSLayoutAnchor_ClassReference/

    and here:

    https://developer.apple.com/library/ios/documentation/AppKit/Reference/NSLayoutDimension_ClassReference/

提交回复
热议问题