使用故事板中设置的标识符来获取对NSLayoutConstraint的引用

Sam*_*ikh 14 cocoa-touch objective-c ios uistoryboard nslayoutconstraint

我正在使用故事板设置按钮的约束.我在约束的属性中看到了一个选项"Identifier".

约束属性的屏幕截图

我想引用这个约束,改变它在代码中的值,移动一个对象.

如何NSLayoutContraint从此标识符中获取对此的引用.

我阅读了文档,它是这样编写的

@interface NSLayoutConstraint (NSIdentifier)
/* For ease in debugging, name a constraint by setting its identifier, which will be printed in the constraint's description.
 Identifiers starting with UI and NS are reserved by the system.
 */
@property (nullable, copy) NSString *identifier NS_AVAILABLE_IOS(7_0);

@end
Run Code Online (Sandbox Code Playgroud)

所以我意识到这是出于调试目的.

如果我想获得它并使用它怎么办?我看到了这个链接,但没有给出令人满意的答案:如何通过其指针获取NSLayoutConstraint的标识符?

Ven*_*enk 23

Swift 3中,

 let filteredConstraints = button.constraints.filter { $0.identifier == "identifier" }
 if let yourConstraint = filteredConstraints.first {
      // DO YOUR LOGIC HERE
 }
Run Code Online (Sandbox Code Playgroud)


que*_*ful 12

斯威夫特3

我写了一个快速的NSView扩展,可以很好地处理这个问题.

extension NSView {
    func constraint(withIdentifier: String) -> NSLayoutConstraint? {
        return self.constraints.filter { $0.identifier == withIdentifier }.first
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

if let c = button.constraint(withIdentifier: "my-button-width") {
    // do stuff with c
}
Run Code Online (Sandbox Code Playgroud)


str*_*ils 9

我假设你为按钮设置了一个插座,所以你有一个可用的参考.首先,从按钮中检索视图的约束.然后遍历数组并在每次迭代时将每个约束的identifer属性与您在Interface Builder中输入的值进行比较.看起来你在Objective-C编码,所以Objective-C代码示例如下.将@"identifier"更改为您在Interface Builder中设置的任何值.

NSArray *constraints = [button constraints];
int count = [constraints count];
int index = 0;
BOOL found = NO;

while (!found && index < count) {
    NSLayoutConstraint *constraint = constraints[index];
    if ( [constraint.identifier isEqualToString:@"identifier"] ) {
        //save the reference to constraint
        found = YES;
    }

    index++;
}
Run Code Online (Sandbox Code Playgroud)


Isa*_*ner 7

您可能希望将先前答案中提供的逻辑外推到扩展中。

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 }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用以下任何地方访问任何约束:

myView.constraintWithIdentifier("myConstraintIdentifier")

编辑:使用上述代码,只为踢球,这是一个扩展,可以在所有子UIViews中使用该标识符查找所有约束。必须更改函数以返回数组,而不是找到的第一个约束。

    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
    }
Run Code Online (Sandbox Code Playgroud)