具有自动布局的NSTextFields; 打字成长为太空

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钉在右边.但它仍然抱怨"不平等约束模糊".

在此输入图像描述

Ped*_*eno 1

自从问这个问题以来已经快一年了,但我认为这是一个非常好的问题,值得一个答案,所以我开始解决你的问题,并设法以一种非常简单的方式解决它。

您可以单击此处在 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)