0

xCode 4.5 の新しい自動レイアウト機能について、かなり混乱しています。

やりたいことはこちら、

ストーリーボードを設定することで、この縦向きビューを設定しました。 ここに画像の説明を入力

自動レイアウトと制約 (およびピン) を使用して、このように横向きに反転したときにレイアウトを変換するにはどうすればよいですか? ここに画像の説明を入力

ビューのCGRect(サイズと座標の位置)をコーディングして変更しようとしましたが、ランドスケープされていましたが、役に立ちませんでした。

4

2 に答える 2

2

NSLayoutConstraints は、自動レイアウトの CGRects の必要性を置き換えます。まず、あなたのレイアウトを言葉で説明してください。あなたの肖像画の例を説明する方法は次のとおりです。

  • 赤の幅はそのスーパービューの 60% です。
  • Blue の高さは、スーパービューの 55% です。
  • ブルーの左端と右端がスーパービューに接触しています。
  • 赤の左端はそのスーパービューに接しており、赤の右端は黄色の左端に近く、黄色の右端はそのスーパービューに接しています。
  • 青の上端はそのスーパービューに接しており、青の下端は赤の上端に近く、赤の下端はそのスーパービューに接しています。
  • ブルーの下端はイエローの上端に近く、イエローの下端はそのスーパービューに接しています。

の既存の制約を削除superviewし、指定されたインターフェイスの向きに新しい制約を適用するメソッドを次に示します。

- (void) buildConstriantsForInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Remove existing constraints.
    [superview removeConstraints:superview.constraints] ;
    // Build an array to hold new constraints.
    NSMutableArray* constraints = [NSMutableArray new] ;

    // Add 2 constraints that apply to both Portrait & Landscape orientations.
    [constraints addObject:[NSLayoutConstraint constraintWithItem:red  attribute:NSLayoutAttributeWidth  relatedBy:NSLayoutRelationEqual  toItem:superview  attribute:NSLayoutAttributeWidth  multiplier:0.6  constant:0]] ;
    [constraints addObject:[NSLayoutConstraint constraintWithItem:blue  attribute:NSLayoutAttributeHeight  relatedBy:NSLayoutRelationEqual  toItem:superview  attribute:NSLayoutAttributeHeight  multiplier:0.55  constant:0]] ;

    // Build a dictionary to store references to NSViews.
    NSDictionary* views = NSDictionaryOfVariableBindings(superview, blue, red, yellow) ;
    // To eliminate repeated NSLayoutConstraint code, build an array of Format Strings with which to build constraints.
    NSArray* formatStrings ;
    if ( UIInterfaceOrientationIsPortrait(interfaceOrientation) ) {
        formatStrings = @[@"H:|[blue]|", @"H:|[red]-[yellow]|", @"V:|[blue]-[red]|", @"V:[blue]-[yellow]|"] ;
    }
    else {
        formatStrings = @[@"H:|[blue]-[yellow]|", @"H:|[red]-[yellow]", @"V:|[blue]-[red]|", @"V:|[yellow]|"] ;
    }

    for ( NSString* formatString in formatStrings ) {
        [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:formatString  options:0  metrics:nil  views:views]] ;
    }

    // Add the newly created constraints.
    [superview addConstraints:constraints] ;
}

ビューがロードまたは回転するたびに、そのメソッドを呼び出すことができます。

-(void) viewDidLoad {
    superview.translatesAutoresizingMaskIntoConstraints = NO ;
    [self buildConstriantsForInterfaceOrientation:self.interfaceOrientation] ;
}

- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [self buildConstriantsForInterfaceOrientation:toInterfaceOrientation] ;
}
于 2013-05-24T15:46:13.370 に答える