Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS:自定义后退按钮过渡动画_Ios_Objective C_Animation_Uinavigationcontroller_Back - Fatal编程技术网

iOS:自定义后退按钮过渡动画

iOS:自定义后退按钮过渡动画,ios,objective-c,animation,uinavigationcontroller,back,Ios,Objective C,Animation,Uinavigationcontroller,Back,我有一个视图控制器(继承自UIViewController),它具有用于显示数据的自定义逻辑。它可以初始化一个新的视图控制器(相同类型),并使用 [self.navigationController推送视图控制器:下一个动画:否] (下一步是新实例化的控制器),创建“视图堆栈”体验,使用导航控制器默认的后退按钮向上导航堆栈 现在,在调用pushViewController:animated:之前,我可以通过调用[self.navigationController.view.layer addAn

我有一个视图控制器(继承自
UIViewController
),它具有用于显示数据的自定义逻辑。它可以初始化一个新的视图控制器(相同类型),并使用
[self.navigationController推送视图控制器:下一个动画:否]
(下一步是新实例化的控制器),创建“视图堆栈”体验,使用导航控制器默认的后退按钮向上导航堆栈

现在,在调用
pushViewController:animated:
之前,我可以通过调用
[self.navigationController.view.layer addAnimation:animation forKey:nil]
自定义转换动画。这对于视图的“向下堆栈”非常有效

但是,由于使用默认的后退按钮以默认方式向上导航堆栈,因此使用的转换是默认的向左滑动动画,与我的自定义动画不匹配

如何自定义此过渡动画

编辑:

我接受了这里给出的想法,并提出:

UIBarButtonItem *back = [[UIBackButtonItem alloc] initWithTitle:@"\U000025C0\U0000FE0E" style:UIBarButtonItemStylePlain target:self action:@selector(back:)];
[self.navigationItem setLeftBarButtonItem:back]
以及过渡:

- (IBAction)back:(id)sender {
    CATransiotion *animation = [CATransition animation];
    animation.duration = 0.3f;
    amimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
    animation.type = kCATransitionMoveIn;
    [self.navigationController.view.layer addAnimation:animation forKey:nil];
    [self.navigationController popViewControllerAnimated:NO];
}
唯一的缺点是新的后退按钮的出现,我愿意接受它

谢谢你的回答:)

对于这种类型的转换,我真的建议使用模态视图控制器,这就是系统的设计方式

但是如果你坚持使用导航控制器,有一种方法,尽管有点难看

[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions];

CATransition *transition = [CATransition animation];
[transition setType:kCATransitionFade];
[self.navigationController.view.layer addAnimation:transition forKey:@"someAnimation"];

[self.navigationController popViewControllerAnimated:YES];
[CATransaction commit];
CATransaction
将禁用所有标准动画。交换视图时,
CATTransition
向导航控制器层添加淡入淡出过渡(在本例中,删除弹出的viewcontroller视图)


同时也参考这个

我想你必须制作你的自定义后退按钮,并将你的动画附加到它上,例如

- (IBAction) back:(id)sender
{       
    [UIView transitionWithView:self.navigationController.view
                      duration:0.5
                       options:UIViewAnimationOptionTransitionFlipFromLeft
                    animations:^{ [self.navigationController popViewControllerAnimated:NO]; }
                    completion:NULL];
}

如果只是想使“后退”按钮返回到上一个视图控制器。不需要代码就可以更轻松地完成这项工作。相反,只需将控件从“后退”按钮拖动到上一个视图控制器。(我更喜欢情态动作片段)。这使它更简单,因为它不涉及代码

我这样做:

-(void)viewWillDisappear:(BOOL)animated {
CATransition *anim = [CATransition animation];
anim.duration = 1;
anim.type = @"cube";
anim.subtype = @"fromLeft";
[super viewWillDisappear:animated];
[self.navigationController.view.layer addAnimation:anim forKey:@"an"]; 
}


而且效果很好

我认为一个自定义的后退按钮是最好的选择,但我希望在代码中这样做。我对Objective C有点陌生,但据我所知,这与构建我不使用的.xib文件有关。