2017-05-31 98 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]; 
} 

希望這會有所幫助。