具有自动布局的 NSTextFields;像打字一样长进太空

Posted

技术标签:

【中文标题】具有自动布局的 NSTextFields;像打字一样长进太空【英文标题】:NSTextFields with auto-layout; grow into space as typing 【发布时间】:2014-04-02 18:23:16 【问题描述】:

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

这是我想要的布局:

以下是限制条件:

我已经尝试了所有方法,但我无法让它工作。当您输入时,我可以让一个文本字段正确增加(使用此链接中的答案:getting a NSTextField to grow with the text in auto layout?),但无法使其与旁边的第二个文本字段一起使用,从而将其推入空白空间。我已经玩弄了内容拥抱/压缩阻力优先级,给文本字段> = 90宽度(右边有一个针)......在IB中似乎没有正确设置(使用Xcode 5.1)。如果我添加宽度约束,它会抱怨约束不明确,或者抱怨缺少没有宽度的约束。

任何想法如何让它工作?

编辑:

这就是我想象的理想布局的样子:右侧固定小于 400 的约束。但它仍然在那里抱怨“不等式约束模糊”。

【问题讨论】:

【参考方案1】:

这个问题被问到已经快一年了,但我认为这是一个非常值得回答的好问题,所以我着手解决您的问题,并设法以一种非常简单的方式解决它。

您可以通过点击here在 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)

界面就是这样。现在,在代码中,您需要一个指向firstTextField 的出口,以及一个用于文本更改时的回调方法。然后,在这个方法中你必须使firstTextFieldinstrinsicContentSize无效:

@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

【讨论】:

以上是关于具有自动布局的 NSTextFields;像打字一样长进太空的主要内容,如果未能解决你的问题,请参考以下文章

如何在打字稿中过滤对象数组

具有动态大小的ios自动布局

是啥导致两个具有相同自动布局约束的 UITableViewCell 表现不同?

具有自动布局的 UIScrollView 中的动态大小的 UITableView

具有动态大小的单元格的复杂自动布局

具有未知键的对象的打字稿类型,但只有数值?