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)
我假设你为按钮设置了一个插座,所以你有一个可用的参考.首先,从按钮中检索视图的约束.然后遍历数组并在每次迭代时将每个约束的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)
您可能希望将先前答案中提供的逻辑外推到扩展中。
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)
| 归档时间: |
|
| 查看次数: |
16566 次 |
| 最近记录: |