Search code examples
iosautolayoutnslayoutconstraint

iOS - Find top constraint for a view?


I am trying to find the top constraint of the view in code. The top constraint is added in storyboard, and I don't want to use an IBOutlet.

Logging the value of the firstAttribute in the following code seems to always return a constraint of type NSLayoutAttributeHeight. Any idea how I could reliably find a top constraint of a view in code?

NSLayoutConstraint *topConstraint;

for (NSLayoutConstraint *constraint in self.constraints) {
    if (constraint.firstAttribute == NSLayoutAttributeTop) {
        topConstraint = constraint;
        break;
    }
}

Solution

  • Instead of iterating through self.constraints, you should iterate through self.superview.constraints.

    The self.constraints only contain constraints related to just the view (e.g. height and width constraints).

    Here's a code example of what this might look like:

    - (void)awakeFromNib
    {
      [super awakeFromNib];
    
      if (!self.topConstraint) {
        [self findTopConstraint];
      }
    }
    
    - (void)findTopConstraint
    {
      for (NSLayoutConstraint *constraint in self.superview.constraints) {
        if ([self isTopConstraint:constraint]) {
          self.topConstraint = constraint;
          break;
        }
      }
    }
    
    - (BOOL)isTopConstraint:(NSLayoutConstraint *)constraint
    {
      return  [self firstItemMatchesTopConstraint:constraint] ||
              [self secondItemMatchesTopConstraint:constraint];
    }
    
    - (BOOL)firstItemMatchesTopConstraint:(NSLayoutConstraint *)constraint
    {
      return constraint.firstItem == self && constraint.firstAttribute == NSLayoutAttributeTop;
    }
    
    - (BOOL)secondItemMatchesTopConstraint:(NSLayoutConstraint *)constraint
    {
      return constraint.secondItem == self && constraint.secondAttribute == NSLayoutAttributeTop;
    }