8

テスト プロジェクトのメイン ビュー コントローラーからの viewDidLoad は次のとおりです。

- (void)viewDidLoad

{ [super viewDidLoad];

UIView *containerView = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 300, 300)];
[self.view addSubview:containerView];

UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 300)];
[redView setBackgroundColor:[UIColor redColor]];
[containerView addSubview:redView];

UIView *yellowView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 300)];
[yellowView setBackgroundColor:[UIColor yellowColor]];


[UIView transitionWithView:containerView duration:3
                   options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{
                       [redView removeFromSuperview];
                       [containerView addSubview:yellowView];
                   }
                completion:NULL];
}

黄色のボックスが表示されます。どの UIViewAnimationOption を試しても、アニメーションはありません。どうして???

編集:私はまた、performSelector withDelay を使用して、アニメーションを viewDidLoad から別のメソッドに移動しようとしました。同じ結果 - アニメーションなし。

これも試してみました: [UIView transitionFromView:redView toView:yellowView duration:3 options:UIViewAnimationOptionTransitionFlipFromLeft completion:NULL];

それでも、黄色のビューが表示されるだけです。アニメーションなし。

4

2 に答える 2

6

いくつかのテストの後、同じランループ内でコンテナビューを作成してアニメーションを設定し、動作させることはできないようです。コードを機能させるために、最初にメソッド内にcontainerViewとを作成しました。次に、アニメーションをメソッドに入れます。メソッドからとを参照できるように、それらをプロパティにしました。必要なアニメーションを実行 するファイルのコードは次のとおりです。redViewviewDidLoadviewDidAppearcontainerViewredViewviewDidAppearST_ViewController.m

@interface ST_ViewController ()
@property (nonatomic, strong) UIView *containerView;
@property (nonatomic, strong) UIView *redView;
@end

@implementation ST_ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self setContainerView:[[UIView alloc] initWithFrame:CGRectMake(10, 10, 300, 300)]];
    [[self view] addSubview:[self containerView]];

    [self setRedView:[[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 300)]];
    [[self redView] setBackgroundColor:[UIColor redColor]];
    [[self containerView] addSubview:[self redView]];
}

-(void)viewDidAppear:(BOOL)animated{

    [super viewDidAppear:animated];



    UIView *yellowView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 300)];
    [yellowView setBackgroundColor:[UIColor yellowColor]];


    [UIView transitionWithView:[self containerView]
                      duration:3
                       options:UIViewAnimationOptionTransitionFlipFromLeft
                    animations:^(void){
                        [[self redView] removeFromSuperview];
                        [[self containerView] addSubview:yellowView];
                         }

                    completion:nil];

}

@end
于 2012-10-18T17:52:24.070 に答える
2

これを入れないでくださいviewDidLoadviewDidLoadビューがメモリに完全にロードされたが、まだ画面に表示されていないときに呼び出されます。

ビューが画面に表示さviewDidAppear:れたときに呼び出される上記のコードを入れてみてください。

編集:補足として、 performSelector:withDelay: で何かが修正された場合、それはあなたが間違ったことをしようとしていることを意味します。何らかの方法でリファクタリングする必要があります。performSelector:withDelay: は、99.999% の確率で問題を解決するための間違った方法です。このコードを異なる速度のデバイス (新しい iPhone、古い iPhone) に配置するとすぐに、めちゃくちゃになります。

于 2011-10-01T00:49:25.170 に答える