【问题标题】:How to implement custom segue animations?如何实现自定义segue动画?
【发布时间】:2014-09-24 11:32:29
【问题描述】:

我将UIStoryboardSegue 子类化以执行自定义转场动画。为了使动画可见,我必须将来自目标 ViewController 的视图添加为临时视图。执行动画后,我将删除临时视图并通过 (presentViewController:animated:NO) 呈现最终的 ViewController

然而,这会导致以下警告:“开始/结束外观转换的不平衡调用”

如果我保留我的临时视图并且不删除它,则不会出现警告,但最终视图不再响应触摸事件。如何摆脱这个警告?

我的自定义转场代码:

-(void)perform {

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

    destinationViewController.view.alpha = 0.;
    destinationViewController.view.transform = CGAffineTransformScale(destinationViewController.view.transform, 4.0, 4.0);

    [sourceViewController.view addSubview:destinationViewController.view];

    [UIView animateWithDuration:kSSSpriteKitFadeOutDuration
                          delay:0.0
                        options:UIViewAnimationOptionCurveEaseInOut
                     animations:^{

                         destinationViewController.view.transform = CGAffineTransformScale(destinationViewController.view.transform, 0.25, 0.25);
                         destinationViewController.view.alpha = 1.;
                     }
                     completion:^(BOOL finished){
                         [destinationViewController.view removeFromSuperview]; // remove from temp super view
                         [sourceViewController presentViewController:destinationViewController animated:NO completion:NULL]; // present VC
                     }];
}

【问题讨论】:

    标签: ios objective-c storyboard uistoryboardsegue


    【解决方案1】:

    我正在参加 4 UIStoryboardSegue 类型的课程。 2 用于动画开始和休息 2 用于动画停止。所以我将分享 4 个类的所有代码。请尝试解决这个问题。

    CustomSegue.h

     #import <UIKit/UIKit.h>
     @interface CustomSegue : UIStoryboardSegue
    
     // Originating point for animation
     @property CGPoint originatingPoint;
     @property CGRect Startingframe;
     @end
    

    CustomSegue.m

     #import "CustomSegue.h"
     @implementation CustomSegue
    
     - (void)perform
     {
       UIViewController *sourceViewController = self.sourceViewController;
       UIViewController *destinationViewController = self.destinationViewController;
    
       // Add the destination view as a subview, temporarily
       [sourceViewController.view addSubview:destinationViewController.view];
    
       // Transformation start scale
       float width = 320;
       float height = 480;
    
       float x_Scale = self.Startingframe.size.width/width;
       float Y_Scale = self.Startingframe.size.height/height;
    
       destinationViewController.view.transform = CGAffineTransformMakeScale(x_Scale, Y_Scale);
    
       // Store original centre point of the destination view
       CGPoint originalCenter = destinationViewController.view.center;
       // Set center to start point of the button
       destinationViewController.view.center = self.originatingPoint;
    
       [UIView animateWithDuration:0.5
                          delay:0.0
                        options:UIViewAnimationOptionCurveEaseInOut
                     animations:^
                    {
                         // Grow!
                          destinationViewController.view.transform = CGAffineTransformMakeScale(1.0, 1.0);
    
                         destinationViewController.view.center = originalCenter;
                     }
                     completion:^(BOOL finished)
                    {
                         [destinationViewController.view removeFromSuperview]; // remove from temp super view
                         [sourceViewController presentViewController:destinationViewController animated:NO completion:NULL]; // present VC
                     }];
     }
    
     @end
    

    CustomUnwindSegue.h

     #import <UIKit/UIKit.h>
     @interface CustomUnwindSegue : UIStoryboardSegue
    
     // Target point to animate to (on the button)
     @property CGPoint targetPoint;
     @property CGRect endFrame;
    
     @end
    

    CustomUnwindSegue.m

     #import "CustomUnwindSegue.h"
    
     @implementation CustomUnwindSegue
    
     - (void)perform {
        UIViewController *sourceViewController = self.sourceViewController;
        UIViewController *destinationViewController = self.destinationViewController;
    
        // Transformation End scale
        float width = 320;
        float height = 480;
    
        float x_Scale = self.endFrame.size.width/width;
        float Y_Scale = self.endFrame.size.height/height;
        // Add view to super view temporarily
        [sourceViewController.view.superview insertSubview:destinationViewController.view atIndex:0];
    
        [UIView animateWithDuration:0.5
                          delay:0.0
                        options:UIViewAnimationOptionCurveEaseInOut
                     animations:^{
                         // Shrink!
                         sourceViewController.view.transform = CGAffineTransformMakeScale(x_Scale, Y_Scale);
                         sourceViewController.view.center = self.targetPoint;
                     }
                     completion:^(BOOL finished){
                         [destinationViewController.view removeFromSuperview]; // remove from temp super view
                         [sourceViewController dismissViewControllerAnimated:NO completion:NULL]; // dismiss VC
                     }];
    }
    
    @end
    

    只需将您的动作与此自定义转场动画连接起来,如下所示:

    【讨论】:

    • 不能将此作为答案,因为它只是一个不同的过渡动画。问题仍然相同。它会导致同样的警告!
    猜你喜欢
    • 2012-06-02
    • 2013-10-15
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 2019-12-29
    相关资源
    最近更新 更多