Search code examples
iosswift3nslayoutconstraint

NSLayoutConstraint margin zero instead of sixteen


I'm building a UICollectionViewCell interface by code. Everything works fine, except the right constraint. When I run the app the title label has a zero margin from the right. Here is my code

let titleLabel: UILabel = {
    let label = UILabel()
    label.backgroundColor = UIColor.purple
    label.translatesAutoresizingMaskIntoConstraints = false
    return label
}()

func setupViews() {
    addSubview(titleLabel)

    // titleLabel
    // top constraint
    addConstraint(NSLayoutConstraint(item: titleLabel, attribute: .top, relatedBy: .equal, toItem: self, attribute: .top, multiplier: 1, constant: 16))
    // left constraint
    addConstraint(NSLayoutConstraint(item: titleLabel, attribute: .left, relatedBy: .equal, toItem: self, attribute: .left, multiplier: 1, constant: 8))
    // right constraint
    addConstraint(NSLayoutConstraint(item: titleLabel, attribute: .right, relatedBy: .equal, toItem: self, attribute: .right, multiplier: 1, constant: 16))
    // height constraint
    addConstraint(NSLayoutConstraint(item: titleLabel, attribute: .height, relatedBy: .equal, toItem: self, attribute: .height, multiplier: 0, constant: 20))
}

I'm thinking it has something to do with toItem: self, because self is the uilabel and I want to related it the UICollectionViewCell


Solution

  • The problem is the order of your items in your constraint. You are currently saying the label is 16 past the right edge of its superview. You can either switch the item and toItem in your right constraint, or use -16 as your constant.

    So either this:

    addConstraint(NSLayoutConstraint(item: self, attribute: .right, relatedBy: .equal, toItem: titleLabel, attribute: .right, multiplier: 1, constant: 16))
    

    or this:

    addConstraint(NSLayoutConstraint(item: titleLabel, attribute: .right, relatedBy: .equal, toItem: self, attribute: .right, multiplier: 1, constant: -16))
    

    will work.