Z S*_*Z S 5 cocoa nsview nstextfield autolayout nslayoutconstraint
我想用这些要求来布局我的视图:a)有2个文本字段,最小宽度为90 b)我希望文本字段始终保持10之间的间隙c)我想要文本字段正在键入以根据需要增大,并开始占用右侧的空白区域.如果第一个字段是类型,它应该变大并将最后一个字段推入空间(当然只增加第一个字段的宽度)d)我希望文本字段在接近右边缘后停止增长视图(标准20像素)e)高度限制很简单:仅22px,顶部与图片顶部对齐
这是我想要的布局:

以下是约束:

我已经尝试了所有的东西,但我无法让它发挥作用.我可以得到一个文本字段,以正确地增加,因为你键入(使用此链接中的答案:?得到一个的NSTextField在自动布局与文本增长),但不能让它与第二个文本字段工作旁边,推动它占据空旷的空间.我已经玩过内容拥抱/压缩阻力优先级,给文本字段> = 90宽度(右边有一个引脚)......似乎没有在IB中正确设置(使用Xcode 5.1).如果我添加宽度约束,或者抱怨没有宽度的缺失约束,它会抱怨约束歧义.
任何想法如何让这个工作?
编辑:
这就是我想象的理想布局:约束小于400钉在右边.但它仍然抱怨"不平等约束模糊".

自从问这个问题以来已经快一年了,但我认为这是一个非常好的问题,值得一个答案,所以我开始解决你的问题,并设法以一种非常简单的方式解决它。
您可以单击此处在 Github 中找到示例项目。
请记住,我是使用 UIKit 完成的,所以我希望您在桌面框架中拥有相同的 API。
首先我设置这样的约束:
firstTextField: {
Leading = 20pt (to superView),
Width >= 90pt,
Trailing = 10pt (to secondTextField),
Vertical Align Y (to superView)
}
secontTextField: {
Leading = 10pt (to firstTextField),
Width >= 90pt,
Trailing = 20pt (to superView),
Vertical Align Y (to superView)
}
Run Code Online (Sandbox Code Playgroud)
接口就这样了。现在,在代码中,您需要一个出口firstTextField以及文本更改时的回调方法。然后,在此方法中,您必须使firstTextFields无效instrinsicContentSize:
@interface ViewController () <UITextFieldDelegate>
@property (weak, nonatomic) IBOutlet UITextField *firstTextField;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[self.firstTextField addTarget:self
action:@selector(textFieldDidChange)
forControlEvents:UIControlEventEditingChanged];
}
- (void)textFieldDidChange
{
[self.firstTextField invalidateIntrinsicContentSize];
}
@end
Run Code Online (Sandbox Code Playgroud)