1

アプリが横向きモードと縦向きモードのときに、一連の画像をさまざまな場所に表示しようとしています。メソッドへの参照を既に検索して見つけましたwillAnimateRotationToInterfaceOrientation:duration。ここで、次のようなコードを追加しました。

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft ||
        toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)
    {
        self.getStartedImage1.frame = CGRectMake(5, 100, 155, 115);
        self.getStartedImage2.frame = CGRectMake(160, 100, 155, 115);
        self.getStartedImage3.frame = CGRectMake(315, 100, 155, 115);
    }
    else
    {
        self.getStartedImage1.frame = CGRectMake(238, 96, 155, 115);
        self.getStartedImage2.frame = CGRectMake(238, 219, 155, 115);
        self.getStartedImage3.frame = CGRectMake(238, 342, 155, 115);
    }
}

これは、既にランドスケープモードでビューに移動すると、メソッドが実行されないことに気付くまではうまくいきました。何も回転せずにビューを開いているので、これは理にかなっています。しかし、それは私の苦境を助けません。そこで私は検索を続け、メソッドにたどり着きましviewWillLayoutSubviewsた。このメソッドに同じ本体を追加して呼び出していますが、画像フレームへの変更がシミュレーターに表示されないため、おそらく遅すぎます。コードを に移動しようとすると、同じ問題が発生しviewWillAppearます。複数のビューを含む複雑なソリューションを見てきましたが、これは避けたいと思います。助言がありますか?

4

1 に答える 1

1

と戦っているようですねautolayout。私が考える解決策は3つあります。

  1. オフにしautolayoutます。既にすべてのビュー フレームを自分で管理している場合は、これがおそらく正しい方法です。

  2. レイアウト コードを に移動します-viewDidLayoutSubviews。これはハックですが、迅速です。また、ほとんどautolayoutのことを行うこともできます。

  3. 適用可能な回転拘束を交換します。これは最も手間がかかりますが、長期的には国際化などの点で最も柔軟であることは間違いありません。

3番について:

制約 ( NSLayoutConstraint) は、IB とコードの両方で検査および編集できる実際のオブジェクトです。レイアウトは非常に複雑になる可能性があるため、ここでは非常に単純な例を示します。ビュー コントローラーのビューに上下に 2 つのボタンがあり (2 つのアウトレットbuttonOneとに接続されているbuttonTwo)、横向きでそれらの位置を逆にしたいとします。このようなコード (この形式ではお勧めできませんが) は機能し、制約を交換する方法の例を提供します。

@implementation MyAutoViewController {
    NSArray *_portraitConstraints;
    NSArray *_landscapeConstraints;
}
-(void)viewDidLoad{
    [super viewDidLoad];

    // Clear constraints from Nib. 
    // PLEASE DO NOT DO THIS PART IN REAL LIFE
    NSArray *current = self.view.constraints;
    for (NSLayoutConstraint *contsra in current) {
        [self.view removeConstraint:contsra];
    }

    // Set up views dictionary
    UIButton *buttonOne = self.buttonOne;
    UIButton *buttonTwo = self.buttonTwo;
    NSDictionary *viewsDict = NSDictionaryOfVariableBindings(buttonOne, buttonTwo);

    // Set distance from left to both buttons to standard space
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[buttonOne]" options:0 metrics:nil views:viewsDict]];
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[buttonTwo]" options:0 metrics:nil views:viewsDict]];

    // HERE IS WHERE IT GETS INTERESTING
    // ### Create portrait constraints ###
    _portraitConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[buttonOne]-[buttonTwo]" options:0 metrics:nil views:viewsDict];

    // ### Create landscape constraints ###
    _landscapeConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[buttonTwo]-[buttonOne]" options:0 metrics:nil views:viewsDict];

    // Add the appropriate constraints
    [self.view addConstraints:(UIInterfaceOrientationIsPortrait(self.interfaceOrientation))?_portraitConstraints:_landscapeConstraints];

}
-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{
    if (UIInterfaceOrientationIsPortrait(toInterfaceOrientation)){
        [self.view removeConstraints:_landscapeConstraints];
        [self.view addConstraints:_portraitConstraints];
    } else {
        [self.view removeConstraints:_portraitConstraints];
        [self.view addConstraints:_landscapeConstraints];
    }
}

autolayoutWWDC2012の 3 つのビデオを見ることを強くお勧めします。Autolayout頭を動かすことはたくさんあります。

于 2013-03-20T20:57:24.697 に答える