2013-12-19 19 views
6

私は、添付された画像で自動レイアウトを使用して縦向きと横向きの異なるレイアウトを設定するにはどうすればよいですか?

enter image description here

ようなビューは、今、私は向きが横に変更されたときにビューのUITextviewは、画面の右側になければならないこと、そのような制約を追加していています。これらの制約はしかし、ambugityにいくつかの警告が表示された私のために仕事をしてくれたスーパー

:スーパー

  • 下スペースへ:UItextviewで、私は
    1. 末尾のスペース

      に、制約の下に追加されました。以下は、ランドスケープモードのスクリーンショットです。

      enter image description here

      私の問題はUItextviewが右側に移動しているが、それは風景モードにあるとき、私はスーパーの上からいくつかの追加の幅をしたいです。言い換えれば、UITextviewを現在の風景モードから少し下に移動したいと思っています。私はIBの自動レイアウトを使用してそれを行う方法を熟考しており、その方法を理解することはできません。

      お願いします。

  • 答えて

    5

    いくつかの方法で制約を適用できますが、IBで行う制約だけで自動的にこれを行う方法はありません。メソッドの乗数と定数の両方を使用して、constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:を使用すると、ポートレートとランドスケープの異なる距離を評価する1つの制約を設定できます。これらの値に何を使用するかを計算するのは難しいので、NSLayoutConstraintのカテゴリを作成しました。これらの方法の一つの例は、これです: - で「ビルド時に削除プレースホルダ」あなたはこれらを使用

    +(NSLayoutConstraint *)topConstraintForView:(UIView *)subview viewAttribute:(NSLayoutAttribute) att superview:(UIView *)superview portraitValue:(CGFloat)pValue landscapeValue:(CGFloat)lValue { 
        CGFloat multiplier = (pValue - lValue)/(superview.bounds.size.height - superview.bounds.size.width); 
        CGFloat constant = pValue - (superview.bounds.size.height * multiplier); 
        NSLayoutConstraint *con = [NSLayoutConstraint constraintWithItem:subview attribute:att relatedBy:0 toItem:superview attribute:NSLayoutAttributeBottom multiplier:multiplier constant:constant]; 
        NSLog(@"top coeffs: %f %f",multiplier,constant); 
        return con; 
    } 
    

    方法、ストーリーボードで始まる肖像制約を追加しますが、ボックスをチェックすることです制約のインスペクタを属性、およびこのように、のviewDidLoadでそれを置き換える:

    - (void)viewDidLoad { 
        [super viewDidLoad]; 
        [self.view addConstraint:[NSLayoutConstraint topConstraintForView:self.textView viewAttribute:NSLayoutAttributeTop superview:self.view portraitValue:225 landscapeValue:50]]; 
    } 
    

    これは、自動的に任意の更なるコードなしでデバイスの回転に基づいてテキストビューの位置を調整します。テキストフィールドの幅を変更して、すべてが適切に収まるようにする必要があるかもしれません。ラベルを "囲む"ラベルをビューに配置すると、グループとして配置するのが簡単になります。そのビューとテキストビューには、高さと幅の制​​約、ビューの上と左、テキストビューの上と右がありました。カテゴリには他の制約も調整する方法があり、http://jmp.sh/b/S4exMJBWftlCeO5GybNOで見つけることができます。

    これを行うもう1つの方法は、IBで作成した制約にIBOutletを作成し、ローテーションコールバックメソッドの1つでIBの定数を調整(定数値)したり、一部を削除したり、他のものを再作成したりすることです。

    +0

    カテゴリメソッドによって返された制約がインストールされた後に、ユーザーがデバイスを回転したとします。回転中は、制約を削除して再インストールする必要があります。つまり、カテゴリメソッドを再度呼び出す必要があります。右? – bilobatum

    +0

    @bilobatum、いいえ、それはこの方法の全体的な点です。あなたはそれをする必要はありません。乗数と定数の組み合わせは、向きに応じて異なる長さに評価されます。 – rdelmar

    +0

    Xcode 5では、乗数はなくなりました。 – brainray

    関連する問題