1

単一のメソッドでビューを変更するために、いくつかのカスタム アニメーションを実行しています。を使用して superView から「fromView」を既に削除しまし[UIView setAnimationDidStopSelector:@selector(removeFromSuperview)]たが、アニメーションの終了後にユーザーの操作を有効にしたいと考えています。

これが私のコードです:

-(void) switchFrom:(UIViewController*) fromViewController To:(UIViewController*) toViewController usingAnimation:(int) animation{
    UIView *fromView = fromViewController.view;
    UIView *toView = toViewController.view;
    /*************** SET ALL DEFAULT TRANSITION SETTINGS ***************/
    // Get the current view frame, width and height
    CGRect pageFrame = fromView.frame;
    CGFloat pageWidth = pageFrame.size.width;
    
    // Create the animation
    [UIView beginAnimations:nil context:nil];
    
    // Create the delegate, so the "fromView" is removed after the transition
    [UIView setAnimationDelegate: fromView];
    [UIView setAnimationDidStopSelector:@selector(removeFromSuperview)];
    
    // Set the transition duration
    [UIView setAnimationDuration: 0.4];

    /*************** IT DOESN'T WORK AT ALL ***************/
    [toView setUserInteractionEnabled:NO];
    [UIView setAnimationDelegate: toView];
    [UIView setAnimationDidStopSelector:@selector(setUserInteractionEnabled:)];
    [toView setUserInteractionEnabled:YES];

    // Add the "toView" as subview of "fromView" superview
    [fromView.superview addSubview:toView];
    switch (animation) {
        case AnimationPushFromRigh:{
            // Position the "toView" to the right corner of the page            
            toView.frame = CGRectOffset(pageFrame, pageWidth,0);
            
            // Animate the "fromView" to the left corner of the page
            fromView.frame = CGRectOffset(pageFrame, -pageWidth,0);
            
            // Animate the "toView" to the center of the page
            toView.frame = pageFrame;
            
            // Animate the "fromView" alpha
            fromView.alpha = 0;
            
            // Set and animate the "toView" alpha
            toView.alpha = 0;
            toView.alpha = 1;

            // Commit the animation
            [UIView commitAnimations];
        }
        .
        .
        .

この 2 つのメソッドを呼び出してsetAnimationDidStopSelector、実際にそれらを連携させるにはどうすればよいでしょうか?

編集1

このコメント付きブロックを置き換えて、次のような @safecase コードを試しました。

/*************** IT DOESN'T WORK AT ALL ***************
[toView setUserInteractionEnabled:NO];
[UIView setAnimationDelegate: toView];
[UIView setAnimationDidStopSelector:@selector(setUserInteractionEnabled:)];
[toView setUserInteractionEnabled:YES];
*************** IT DOESN'T WORK AT ALL ***************/
// Remove the interaction
[toView setUserInteractionEnabled:NO];
[fromView setUserInteractionEnabled:NO];
// Create the animation
[UIView animateWithDuration:0.4 animations:^{
    [fromView performSelector:@selector(removeFromSuperview)];
    }
    completion:^(BOOL finished){
        [UIView animateWithDuration:0.4 
        animations:^{ 
            C6Log(@"finished");
            [toView performSelector: @selector(setUserInteractionEnabled:)];
        }];
    }];

「fromView」が削除される代わりに「toView」が削除されます:(ボタンはアニメーション中も引き続きインタラクティブです

4

5 に答える 5

2

あなたは知っbeginIgnoringInteractionEventsていendIgnoringInteractionEventsますか?通常、アニメーション中に userInteraction が必要ない場合は、それらを使用します。

とにかく、それらをトリガーするには正しいコールバックが必要です。

于 2012-06-14T01:47:25.947 に答える
1

あなたはこれを使うことができます:

 [UIView animateWithDuration:0.4

 animations:^{ [self performSelector:@selector(removeFromSuperview)]; // other code here}

 completion:^(BOOL finished){ [UIView animateWithDuration:0.4

 animations:^{ [self performSelector:@selector(setUserInteractionEnabled:)]; //other code here}]; }];

お役に立てば幸いです。

于 2012-06-13T05:39:13.180 に答える
1

たとえば、独自のメソッドを定義し、remove:それをセレクターとして渡す必要があります。メソッドでは、渡された を使用しUIViewて削除します。

-(void)remove:(id)sender {
   UIView *v = (UIView*)sender;
   [v removeFromSuperview];
}
于 2012-06-12T12:07:52.517 に答える
0

UIViewのCategory拡張機能を作成することになりました…そしてそれはついに機能します!

UIView+Animated.hコード

#import <UIKit/UIKit.h>

@interface UIView (Animated)

- (void) finishedAnimation;

@end

UIView+Animated.mコード

#import "UIView+Animated.h"

@implementation UIView (Animated)

- (void) finishedAnimation{
    C6Log(@"FinishedAnimation!");
    [self removeFromSuperview];
    [[UIApplication sharedApplication] endIgnoringInteractionEvents];
}

@end

次に、この拡張機能を調整コントローラーに#インポートしました。

C6CoordinatingController.h部分コード

#import "UIView+Animated.h"

そして、setAnimationDidStopSelectorでセレクターを呼び出します。

C6CoordinatingController.m部分コード

// Create the delegate, so the "fromView" is removed after the transition
[UIView setAnimationDelegate: fromView];

// Ignore interaction events during the animation
[[UIApplication sharedApplication] beginIgnoringInteractionEvents];

// Set the transition duration
[UIView setAnimationDuration: 0.4];

// Call UIView+Animated "finishedAnimation" method when animation stops
[UIView setAnimationDidStopSelector:@selector(finishedAnimation)];

だから、私は@ jaydee3と@Mundiのコンセプトを使うことになり、それは魅力のように機能します!

君たちありがとう!

于 2012-06-14T10:37:45.500 に答える
0

ユーザーインタラクションを有効にするために使用できると思います
self.view.userInteractionEnabled=NO;

于 2012-06-13T05:48:20.387 に答える