1

サブビューが制約に基づいて調整されるビューがあります (iOS 6 より前、自動レイアウトなし)。デバイスを回転させると、ビューが期待どおりに新しい位置と寸法にアニメーション化されます。

XIB に新しいビューを追加します。このビューは、デバイスが回転するときに制約によって記述できない方法で位置を変更する必要があります。新しいビュー以外のすべてにデフォルトの回転ロジックを許可することは可能ですか?

そうでない場合(そしてこの質問はそうではないことを示唆しています)、このケースはどのように処理されるべきですか?

回転と同時に独自のアニメーションを追加しようとしましたが、これはほぼ確実に間違っています (おそらく 2 つのアニメーションが同時に発生しているため、フレームが常に正確に同じ場所になるとは限りません)。

// Called on "viewWillAppear"
- (void)adjustLayout
{
    if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation))
    {
        self.myView.frame = CGRectMake(150, 128, 181, 39);
    }
    else
    {
        self.myView.frame = CGRectMake(119, 148, 181, 39);
    }
}

// Called on willRotateToInterfaceOrientation
- (void)adjustLayoutToOrientation:(UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration
{
    // This is not really a good way to override the default animations, but it gets the job done.
    [UIView animateWithDuration:duration animations:^{
        if (UIInterfaceOrientationIsLandscape(orientation))
        {
            NSLog(@"frame: %@", NSStringFromCGRect(self.myView.frame));
            self.myView.frame = CGRectMake(69, 201, 181, 39);
        }
        else
        {
            NSLog(@"frame: %@", NSStringFromCGRect(self.myView.frame));
            self.myView.frame = CGRectMake(258, 94, 181, 39);
        }
    }];
}
4

1 に答える 1

1

解決策は、メソッドでカスタム ビュー要素をレイアウトすることです。

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:

このブロック中に呼び出されるすべてのレイアウト変更は、標準の回転アニメーションとともにアニメーション化されます。

例:

#import "OSViewController.h"

@implementation OSViewController

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{
    return YES;
}

-(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{
    [self layout];
}

-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    [self update];
    [self layout];
}

-(void)update{

}

-(void)layout{

}

@end
于 2013-05-14T19:53:12.543 に答える