2017-05-31 11 views
0

UITextFieldの幅を別の幅の幅に基づいて変更しようとしています。ここに私のレイアウトの例です:私は始めて、右の間で右UITextFieldを拡張するためにマージンこれを0に設定する(一度選択int型ダイアログのコードが含まれている)左のボックスでUITextFieldの幅を他のサイズの拡大に合わせて縮小する

Layout with two text fields

。左のボックスにデータが含まれている場合は、右のテキストフィールドの境界を基準にして調整します。

私はAndroidでこれを簡単に行う方法を知っていますが、私はXcodeで大したことはありません。誰かが私を正しい方向に向けることができますか?

+0

自動レイアウトを使用していますか? –

+0

はい - 左のUILabelにあります。しかし、私は右手のUITextFieldボックスの幅で設定したいが、左のUILabelが大きくなると縮小したい –

答えて

1

基本的な考え方は、

  1. テキスト変更イベント
  2. はここ幅制約の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. 右マージン(またはその他の項目は、単純に左マージンを修正する):あなたはこれらの水平制約がインストールされていることを確認してください右のテキストフィールドの左余白(これはテキストフィールドの間のギャップです、標準は8pxですが、もちろんあなたが望むものを使用します)
    3. コンテナの右側の右のテキストフィールドの右余白か、右端から

    2つのテキストフィールドは左右のマージンの間にあるスペースを占有し、autolayoutはどのテキストフィールドが優先されるかを決める必要があります。左のテキストフィールドでハギングの優先度を高く設定すると、使用可能なスペースがある場合は右のテキストフィールドを展開する方が望ましいと言われます。したがって、両方のフィールドが空白の場合は、完全なスペースが使用されます。このため、テキストフィールドのサイズ/サイズを制限するために、より大きいか小さいかの制約を設定する必要があります。

    ここでは、両方のテキストフィールドが空で始まるものとします。この時点で、左のテキストフィールドに最小の幅を指定することは賢明です。そうでないと、幅が0になり、テキストを入力できなくなるからです。テキストの入力を可能にするには、最小サイズ約50が妥当であるべきですが、何が効果的かを試してみてください。

    テキスト編集をキャプチャすることを忘れないでくださいので、あなたのviewDidLoadまたは他の初期化方法で

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

    どこかを呼び出し、あなたはleftTextFieldという名前の変数にテキストフィールドを持っていると仮定すると、テキストフィールドのプロパティを変更しました。

    残っているのは、ビューの本来のサイズを再計算して更新するようにautolayoutに依頼することだけです。これはlayoutIfNeededを呼び出すことによって行われているので、あなたの方法は、このことができます

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

    希望のようになります。

    関連する問題