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?

  • What is a 'UIView-Encapsulated-Layout-Width' constraint?
  • Get reference to NSLayoutConstraint using Identifier set in storyboard
  • Swift NSLayoutConstraint Equation Based Constant
  • How can I rearrange views when autorotating with autolayout?
  • Unable to make outlet connection to a constraint in IB
  • Centering view with visual format NSLayoutConstraints
  • NSLayoutConstraint *topConstraint;
    
    for (NSLayoutConstraint *constraint in self.constraints) {
        if (constraint.firstAttribute == NSLayoutAttributeTop) {
            topConstraint = constraint;
            break;
        }
    }
    

    3 Solutions Collect From Internet About “iOS – Find top constraint for a view?”

    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;
    }
    

    I usually set an identifier of a required constraint in the IB and then find it in the code like this (Swift):

    if let index = constraints.index(where: { $0.identifier == "checkmarkLeftMargin" }) {
        checkmarkImageViewLeftMargin = constraints[index]
    }
    

    OR by @Tim Vermeulen

    checkmarkImageViewLeftMargin = constraints.first { $0.identifier == "checkmarkLeftMargin" }
    

    Set the identifier in the inspector in Xcode. That’s what it’s for. You name it.
    If that’s not enough you create the IBOutlet.