2012-05-28 19 views
10

मैं ज़ूम एनीमेशन का एक प्रकार करने के लिए एक कस्टम सेग्यू का उपयोग करने की कोशिश कर रहा हूं। जब संक्रमण निष्पादित किया जाता है, तो स्रोत व्यू कंट्रोलर काला हो जाता है, फिर ज़ूम होता है।कस्टम सेग्यू एनीमेशन

पुशव्यू कंट्रोलर सेट करने के लिए भी प्रयास किया: समापन ब्लॉक में लेकिन संक्रमण बिल्कुल निष्पादित नहीं किया गया है।

- (void)perform { 

    UIViewController *sourceViewController = (UIViewController *) self.sourceViewController; 
    UIViewController *destinationViewController = (UIViewController *) self.destinationViewController; 

    [destinationViewController.view setTransform:CGAffineTransformMakeScale(0.5,0.5)]; 
    [destinationViewController.view setAlpha:0.0]; 

    [UIView animateWithDuration:0.5 
          delay:0.0 
         options:UIViewAnimationCurveEaseOut 
        animations:^{ 
         [destinationViewController.view setTransform:CGAffineTransformMakeScale(1.0,1.0)]; 
         [destinationViewController.view setAlpha:1.0]; 
         [sourceViewController.navigationController pushViewController:destinationViewController animated:NO]; 
        } 
        completion:^(BOOL finished){ 
        }]; 

} 

मैं क्या गलत कर रहा हूं?

उत्तर

16

यह क्लाउगी लगता है, लेकिन आप अपनी एनीमेशन से पहले एक सबव्यूव के रूप में गंतव्यViewController.view जोड़ने का प्रयास कर सकते हैं और फिर जब एनीमेशन किया जाता है, तो इसे हटा दें और एनीमेशन के बिना इसे वापस दबाएं। संक्रमण से पहले काली स्क्रीन को हल करती है, लेकिन शायद सही नहीं है, क्या आप नेविगेशन पट्टी के साथ क्या करना चाहते हैं, लेकिन शायद करीब पर निर्भर करता है:

[sourceViewController.view addSubview:destinationViewController.view]; 
[destinationViewController.view setFrame:sourceViewController.view.window.frame]; 
[destinationViewController.view setTransform:CGAffineTransformMakeScale(0.5,0.5)]; 
[destinationViewController.view setAlpha:1.0]; 

[UIView animateWithDuration:0.5 
         delay:0.0 
        options:UIViewAnimationCurveEaseOut 
       animations:^{ 
        [destinationViewController.view setTransform:CGAffineTransformMakeScale(1.0,1.0)]; 
        [destinationViewController.view setAlpha:1.0]; 
       } 
       completion:^(BOOL finished){ 
        [destinationViewController.view removeFromSuperview]; 
        [sourceViewController.navigationController pushViewController:destinationViewController animated:NO]; 
       }]; 

ध्यान दें, प्रभावी iOS 7, आप कस्टम संक्रमण का प्रयोग करेंगे । अधिक जानकारी के लिए, डब्ल्यूडब्ल्यूडीसी 2013 Custom Transitions Using View Controllers देखें।

self.navigationController.delegate = self; 

फिर, यह धक्का के लिए कस्टम एनिमेटरों में निर्दिष्ट करना होगा:

उदाहरण के लिए, यदि नेविगेशन नियंत्रक के साथ एक कस्टम संक्रमण करने का प्रयास कर, पहली बार देखने नियंत्रक ही नेविगेशन नियंत्रक के प्रतिनिधि के रूप में निर्दिष्ट करना होगा और पॉप क्रमश:

- (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController 
            animationControllerForOperation:(UINavigationControllerOperation)operation 
               fromViewController:(UIViewController *)fromVC 
               toViewController:(UIViewController *)toVC 
{ 
    if (operation == UINavigationControllerOperationPush) { 
     return [[PushAnimator alloc] init]; 
    } else { 
     return [[PopAnimator alloc] init]; 
    } 
} 

और फिर आप स्पष्ट रूप से इन एनिमेटरों को लागू करेंगे:

@interface PushAnimator : NSObject <UIViewControllerAnimatedTransitioning> 

@end 

@implementation PushAnimator 

- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext 
{ 
    return 0.5; 
} 

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext 
{ 
    UIViewController* toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; 
    UIViewController* fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; 

    [[transitionContext containerView] addSubview:toViewController.view]; 
    toViewController.view.frame = fromViewController.view.frame; 
    toViewController.view.transform = CGAffineTransformMakeScale(0.5,0.5); 
    toViewController.view.alpha = 0.0; 

    [UIView animateWithDuration:[self transitionDuration:transitionContext] delay:0.0 options:0 animations:^{ 
     toViewController.view.transform = CGAffineTransformIdentity; 
     toViewController.view.alpha = 1.0; 
    } completion:^(BOOL finished) { 
     [fromViewController.view removeFromSuperview]; 
     [transitionContext completeTransition:![transitionContext transitionWasCancelled]]; 
    }]; 
} 

@end 

और

@interface PopAnimator : NSObject <UIViewControllerAnimatedTransitioning> 

@end 

@implementation PopAnimator 

- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext 
{ 
    return 0.5; 
} 

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext 
{ 
    UIViewController* toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; 
    UIViewController* fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; 

    [[transitionContext containerView] insertSubview:toViewController.view belowSubview:fromViewController.view]; 
    toViewController.view.frame = fromViewController.view.frame; 

    [UIView animateWithDuration:[self transitionDuration:transitionContext] delay:0.0 options:0 animations:^{ 
     fromViewController.view.transform = CGAffineTransformMakeScale(0.5,0.5); 
     fromViewController.view.alpha = 0.0; 
    } completion:^(BOOL finished) { 
     [fromViewController.view removeFromSuperview]; 
     [transitionContext completeTransition:![transitionContext transitionWasCancelled]]; 
    }]; 
} 

@end 
+0

धन्यवाद, यह ठीक काम कर रहा है! – Nimrod7

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^