2017-05-31 84 views
0

我试图根据另一个的增加宽度来修改UITextField的宽度。这是我的布局的例子:基于另一个增长的UITextField的收缩宽度

Layout with two text fields

在左侧箱(包含一次选择INT对话框代码)我想将它设置为0保证金入手,右延伸跨过右UITextField。当左边框包含数据时,我想调整右边文本框的边框。

我知道如何在Android中轻松做到这一点,但我在Xcode中没有太多运气。任何人都可以将我指向正确的方向吗?

+0

您是否使用自动布局? –

+0

是的 - 在左边的UILabel。但是我想用右手UITextField框的宽度进行设置,但是当左侧的UILabel增长时将其缩小 –

回答

1

的基本思路是

  1. 观察文本改变事件
  2. 重新计算宽度
  3. 更新宽度约束

这里的constant属性是一个简单的演示和更多的边缘案件需要考虑。

demo

- (void)viewDidLoad { 
    UIView *container = [[UIView alloc] initWithFrame:CGRectMake(100, 150, 175, 100)]; 
    container.backgroundColor = [UIColor grayColor]; 
    [self.view addSubview:container]; 

    //initialize text fields 
    UITextField *leftInput = [[UITextField alloc] initWithFrame:CGRectZero]; 
    leftInput.translatesAutoresizingMaskIntoConstraints = NO; 
    [leftInput addTarget:self action:@selector(textDidChange:) forControlEvents:UIControlEventEditingChanged]; 
    [container addSubview:leftInput]; 

    UITextField *rightInput = [[UITextField alloc] initWithFrame:CGRectZero]; 
    rightInput.translatesAutoresizingMaskIntoConstraints = NO; 
    [container addSubview:rightInput]; 

    //setup constraints 
    NSDictionary *views = NSDictionaryOfVariableBindings(container, leftInput, rightInput); 
    NSMutableArray *constraints = [NSMutableArray array]; 
    [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[leftInput]-[rightInput]-|" options:0 metrics:nil views:views]]; 
    [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[leftInput]-|" options:0 metrics:nil views:views]]; 
    [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[rightInput]-|" options:0 metrics:nil views:views]]; 
    NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:leftInput attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:0 multiplier:0 constant:minWidth]; 
    [constraints addObject:widthConstraint]; 
    self.widthConstraint = widthConstraint; 
    [NSLayoutConstraint activateConstraints:constraints]; 
} 

- (void)textDidChange:(UITextField *)textInput { 
    NSDictionary *attributes = @{NSFontAttributeName: textInput.font}; 
    CGFloat width = [textInput.text sizeWithAttributes:attributes].width; 
    self.widthConstraint.constant = MAX(minWidth, width); 
} 
0

这里是不使用常量的替代方案。我们的想法是设置自动布局,以便重新计算左侧文本字段的宽度,以便在文本更改时更新布局。

首先,在左侧文本字段上设置拥抱优先级高于右侧文本字段。请确保你已经安装了这些水平限制:左的文本字段的容器

  1. 左缘(或其他项目,只需修复左旁)
  2. 离开文本字段的右页边距应该有一个固定的水平间距左边距右边的文本字段(这是文本字段之间的差距,标准为8像素,但当然使用你想要的)
  3. 右侧文本框的右侧边距或容器的右侧或用于锚定右侧

这个力量两个文本字段占用左右边距之间的某个给定空间,自动布局必须决定哪个文本字段优先。通过为左侧文本字段设置更高的拥抱优先级,您声明如果有可用空间,则更喜欢右侧文本字段进行展开,因此如果两个字段均为空,则右侧将占用整个空间。这就是为什么您需要设置大于或小于约束来限制文本字段可以获得的小/大小。

现在,我们假设我们从两个文本字段都是空的开始。此时,为左侧文本字段提供最小宽度会很明智,因为否则它的宽度将为0,因此无法输入任何文本。大约50的最小尺寸应该是合理的,以允许输入文字,但尝试看看什么适合你。

记住捕获文本编辑的文本字段改变属性,所以假设你有一个名为leftTextField可变文本字段,调用

[leftTextField addTarget:self action:@selector(leftTextChanged) forControlEvents:UIControlEventEditingChanged]; 

某处您的viewDidLoad或其他初始化方法。

现在剩下的就是要求autolayout重新计算视图的固有尺寸并更新自身。这是通过呼吁layoutIfNeeded,所以你的方法看起来像

- (void)leftTextChanged { 
    [self.view layoutIfNeeded]; 
} 

希望这会有所帮助。