0

アニメーションに問題があります。問題は、既に作成されているビューをアニメーション化しようとするとすべてうまくいきますが、同時にビューを作成してアニメーション化しようとするとアニメーションが機能しないことです。

誰でも私を助けることができますか?

私の方法

+ (LoginView *)sharedInstance {
    @synchronized(self) {
        if (nil == _sharedInstance) {
            _sharedInstance = (LoginView *)[[[NSBundle mainBundle] loadNibNamed:@"LoginView" owner:nil options:nil] objectAtIndex:0];
        }
    }
    return _sharedInstance;
}

- (void)hide:(BOOL)value animated:(BOOL)animated {
    CATransition * animation = [CATransition animation];

    animation.type = kCATransitionFade;
    [animation setDuration:1.0];

    if(_autoManageModalView)
        [animation setDelegate:self];

    [[self layer] removeAllAnimations];
    [[self layer] addAnimation:animation forKey:kCATransition];

    self.hidden = value;
}

私はそれらをどのように呼びますか

[[LoginView sharedInstance] hide:NO animated:YES];

1 回目 (同じ呼び出し) のアニメーションは機能しませんが、2 回目からはすべてうまくいきます。少し早いですがお礼を!

4

1 に答える 1

2

ライフサイクルの早い段階でビューをアニメーション化しています。理論的には、ビューを作成し、それをどこかに表示して (例: addSubview:)、アニメーション化します。

確認していませんが、hide:animated:メソッドが最初に呼び出されたときにself.layerプロパティが null である可能性が高くなります。いずれにせよ、ビューが表示される前にアニメーションが発生するため、表示されません。

hide:animated:全体として、最初にビューを表示してから、そのメソッドを呼び出します。

コメントの後:hide:animated:次のようなメソッドを使用してメソッドを呼び出してみてください:

 performSelector:withObject:afterDelay:

0.0 の遅延を指定するとhide:animate:、メイン ループの呼び出しがキューに入れられるだけで、関連するすべての処理が実行loadNibNamed:され、ビューが正しく表示されるように設定される時間が与えられます。

使用performSelector:withObject:afterDelay:するには、メソッド シグネチャを変更して引数を 1 つ取り、プリミティブ型ではなく NSObject から派生した型にする必要があります。

于 2012-06-05T08:39:44.443 に答える