Get reference to NSLayoutConstraint using Identifier set in storyboard

前端 未结 6 1510
旧时难觅i
旧时难觅i 2020-12-30 02:02

I was setting the constraints of a button using a storyboard. I saw an option, \"Identifier\" in the constraint\'s properties.

6条回答
  •  温柔的废话
    2020-12-30 02:30

    You may wish to extrapolate the logic provided in previous answer into an extension.

    extension UIView {
        /// Returns the first constraint with the given identifier, if available.
        ///
        /// - Parameter identifier: The constraint identifier.
        func constraintWithIdentifier(_ identifier: String) -> NSLayoutConstraint? {
            return self.constraints.first { $0.identifier == identifier }
        }
    }
    

    You can then access any constraint anywhere using:

    myView.constraintWithIdentifier("myConstraintIdentifier")

    Edit: Just for kicks, using the above code, here's an extension that finds all the constraints with that identifier in all the child UIViews. Had to change the function to return an array instead of the first constraint found.

        func constraintsWithIdentifier(_ identifier: String) -> [NSLayoutConstraint] {
            return self.constraints.filter { $0.identifier == identifier }
        }
    
        func recursiveConstraintsWithIdentifier(_ identifier: String) -> [NSLayoutConstraint] {
            var constraintsArray: [NSLayoutConstraint] = []
    
            var subviews: [UIView] = [self]
    
            while !subviews.isEmpty {
                constraintsArray += subviews.flatMap { $0.constraintsWithIdentifier(identifier) }
                subviews = subviews.flatMap { $0.subviews }
            }
    
            return constraintsArray
        }
    

提交回复
热议问题