gpt4 book ai didi

ios - NSLayoutConstraint 和 "attach"两个标签互相

转载 作者:可可西里 更新时间:2023-11-01 05:23:11 25 4
gpt4 key购买 nike

我有两个标签。如果移动一个,我希望能够同时移动两者。我如何将它们与 NSLayoutConstraints“附加”在一起?我可以在 IB 中执行此操作,但需要在代码中执行。

还有,什么是 NSLayoutAttributeBaseline、NSLayoutAttributeLeading 和 NSLayoutAttributeTrailing?

编辑:

居中 poweredByLabel(又名 label02):

[constraints addObject:[NSLayoutConstraint constraintWithItem:poweredByLabel
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:myImage
attribute:NSLayoutAttributeCenterX
multiplier:1.0
constant:0]];

堆叠标签并垂直切换:

[constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[rememberPasswordSwitch]-10-[rememberPasswordLabel]-10-[versionLabel]-[poweredByLabel]-|"
options:NSLayoutFormatAlignAllBaseline
metrics:nil
views:viewsDictionary]];

产生错误:

* Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse constraint format: Options mask required views to be aligned on a vertical edge, which is not allowed for layout that is also vertical. V:[rememberPasswordSwitch]-10-[rememberPasswordLabel]-10-[versionLabel]-[poweredByLabel]-|...........................................................................................................^'

没有 NSLayoutFormatAlignAllBaseline 选项,它运行良好(它们堆叠但并非全部水平居中)。

最佳答案

如果您需要在代码中执行此操作,请首先创建 NSLayoutConstraint,然后将约束添加到标签的父 View 。

有两种方法可以在代码中创建约束。 constraintsWithVisualFormat 通常比 constraintWithItem 简洁得多。

// Make label1's NSLayoutAttributeTrailing be the 'standard Aqua space' away from label2's NSLayoutAttributeLeading. Also, vertically align their baselines.
NSArray* constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[label1]-[label2]" options:NSLayoutFormatAlignAllBaseline metrics:nil views:NSDictionaryOfVariableBindings(label1, label2) ] ;

然后将约束添加到标签的父 View :

[label1.superview  addConstraints:constraints] ;   // Use `label1.superview` or your own reference to the label's superview.

Cocoa Auto Layout Guide简短易懂。请阅读它,我很乐意回答您仍有的任何问题。

编辑 1

选项 NSLayoutFormatAlignAllBaseline 创建约束(除了由 VisualFormat 字符串创建的约束)垂直对齐所有指定对象的基线。如果您的 VisualFormat 字符串正在创建垂直约束(它以“V:”开头),则您不想使用此选项。你会想要使用 0(这意味着没有选项),或者一个创建水平约束的选项,比如 NSLayoutFormatAlignAllCenterX。

关于ios - NSLayoutConstraint 和 "attach"两个标签互相,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14243943/

25 4 0