Ios7 iOS 7应用程序因自定义转换而崩溃

Ios7 iOS 7应用程序因自定义转换而崩溃,ios7,uinavigationcontroller,uiviewanimationtransition,Ios7,Uinavigationcontroller,Uiviewanimationtransition,我正在尝试向现有iOS应用程序添加自定义转换。它似乎一直在崩溃。我的应用程序有一个主导航控制器,我将其分为子类。导航控制器的根控制器充当UINavigationController的代理 PS:我也尝试过使自定义导航控制器成为其自身的委托,但在调用animationControllerForOperation委托方法之前它崩溃了 这是我的密码 自定义导航控制器 @interface MainNavigationViewController : UINavigationController @

我正在尝试向现有iOS应用程序添加自定义转换。它似乎一直在崩溃。我的应用程序有一个主导航控制器,我将其分为子类。导航控制器的根控制器充当UINavigationController的代理

PS:我也尝试过使自定义导航控制器成为其自身的委托,但在调用animationControllerForOperation委托方法之前它崩溃了

这是我的密码

自定义导航控制器

@interface MainNavigationViewController : UINavigationController

@end

@implementation MainNavigationViewController


- (id <UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
                                   animationControllerForOperation:(UINavigationControllerOperation)operation
                                                fromViewController:(UIViewController *)fromVC
                                                    toViewController:(UIViewController *)toVC
{
   if ([fromVC isKindOfClass:[FlowLayoutCategoryController class]] && [toVC isKindOfClass:[FlowLayoutCategoryController class]]) {

        if (operation == UINavigationControllerOperationPush) {
            CategoryTransitionAnimation *animation = [CategoryTransitionAnimation new];
            animation.type = TransitionTypePush;
            return animation;
        }
        else if (operation == UINavigationControllerOperationPop) {
            CategoryTransitionAnimation *animation = [CategoryTransitionAnimation new];
            animation.type = TransitionTypePop;
            return animation;
        }
        else {
            return nil;
        }
    }
    return nil;
}
@界面主导航视图控制器:UINavigationController
@结束
@实现MainNavigationViewController
-(id)导航控制器:(UINavigationController*)导航控制器
AnimationControllerOperation:(UINavigationControllerOperation)操作
fromViewController:(UIViewController*)fromVC
toViewController:(UIViewController*)toVC
{
如果([fromVC isKindOfClass:[FlowLayoutCategoryController类]]&&[toVC isKindOfClass:[FlowLayoutCategoryController类]]){
if(操作==UINavigationControllerOperationPush){
CategoryTransitionAnimation*动画=[CategoryTransitionAnimation new];
animation.type=TransitionTypePush;
返回动画;
}
else if(操作==UINavigationControllerOperationPop){
CategoryTransitionAnimation*动画=[CategoryTransitionAnimation new];
animation.type=TransitionTypePop;
返回动画;
}
否则{
返回零;
}
}
返回零;
}
过渡动画类

typedef enum
{
    TransitionTypePush,
    TransitionTypePop
} TransitionType;

@interface CategoryTransitionAnimation : NSObject<UIViewControllerAnimatedTransitioning>

@property (nonatomic, assign) TransitionType type;

@end


#import "CategoryTransitionAnimation.h"

@implementation CategoryTransitionAnimation

#pragma mark - UIViewControllerAnimatedTransitioning

- (void) animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
    //Get references to the view hierarchy
    UIView *containerView = [transitionContext containerView];
    UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

    if (self.type == TransitionTypePush) {
        //Add 'to' view to the hierarchy with 0.0 scale
        toViewController.view.transform = CGAffineTransformMakeScale(0.0, 0.0);
        [containerView insertSubview:toViewController.view aboveSubview:fromViewController.view];

        //Scale the 'to' view to to its final position
        [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
            toViewController.view.transform = CGAffineTransformMakeScale(1.0, 1.0);
        } completion:^(BOOL finished) {
            [transitionContext completeTransition:YES];
        }];
    } else if (self.type == TransitionTypePop) {
        //Add 'to' view to the hierarchy
        [containerView insertSubview:toViewController.view belowSubview:fromViewController.view];

        //Scale the 'from' view down until it disappears
        [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
            fromViewController.view.transform = CGAffineTransformMakeScale(0.0, 0.0);
        } completion:^(BOOL finished) {
            [transitionContext completeTransition:YES];
        }];
    }
}

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

@end
typedef枚举
{
TransitionTypePush,
TransitionTypePop
}过渡类型;
@接口类别TransitionAnimation:NSObject
@属性(非原子,赋值)TransitionType类型;
@结束
#导入“CategoryTransitionAnimation.h”
@实现类别转换动画
#pragma标记-UIViewControlleranimated转换
-(void)animateTransfion:(id)transitionContext
{
//获取对视图层次结构的引用
UIView*containerView=[transitionContext containerView];
UIViewController*fromViewController=[transitionContext ViewControllerWorky:UITransitionContextFromViewControllerKey];
UIViewController*toViewController=[transitionContext ViewControllerWorky:UITransitionContextToViewControllerKey];
if(self.type==TransitionTypePush){
//将“到”视图添加到比例为0.0的层次结构中
toViewController.view.transform=CGAffineTransformMakeScale(0.0,0.0);
[containerView insertSubview:toViewController.view上面的子视图:fromViewController.view];
//将“到”视图缩放到其最终位置
[UIView animateWithDuration:[self-transitionDuration:transitionContext]动画:^{
toViewController.view.transform=CGAffineTransformMakeScale(1.0,1.0);
}完成:^(布尔完成){
[transitionContext completeTransition:是];
}];
}else if(self.type==TransitionTypePop){
//将“to”视图添加到层次结构中
[containerView insertSubview:toViewController.view下的SubView:fromViewController.view];
//向下缩放“自”视图,直到其消失
[UIView animateWithDuration:[self-transitionDuration:transitionContext]动画:^{
fromViewController.view.transform=CGAffineTransformMakeScale(0.0,0.0);
}完成:^(布尔完成){
[transitionContext completeTransition:是];
}];
}
}
-(NSTimeInterval)transitionDuration:(id)transitionContext
{
返回1.0;
}
@结束

我猜问题在于您忽略了一个步骤:您应该为“to”视图控制器获取
finalFrameForViewController:
,并将视图的帧设置为该步骤。只是一个猜测,但我忍不住注意到,您没有为视图提供任何帧,这不太好。

如果视图崩溃,那么您的代码是错误的。但是你没有显示任何代码,所以没有人知道问题出在哪里。您想看一些可以工作的自定义转换代码吗?在我的github站点上,我有很多这样的例子:看看从bk2ch06p292customAnimation1I开始的6个例子,我已经添加了我的代码。我尝试在我的代码中添加断点,但应用程序在进入我的任何代码之前崩溃;没有代码的项目不会崩溃。创建一个全局异常断点,以便可以在引发异常的点捕获异常。顺便说一句,在
animateTransition:
方法中,它似乎正在崩溃。因此,您可以在它的开头设置一个断点,然后遍历以找到它崩溃的地方。你的代码看起来很简单,所以我相信我们能找到它!