我正在尝试将类似iBooks的翻转过渡实现为故事板。 segue应该推动。将destinationViewController
弹出到UINavigationControllers堆栈上。
我可以在我的segues perform
方法中推送viewcontrollers,但我无法弹出。当我在创建翻转动画后立即弹出控制器时,动画不会运行,并且它的回调 - 应执行[[UIApplication sharedApplication] endIgnoringInteractionEvents]
从未被调用,我的应用程序结果已经死亡。
所以我尝试在animationDidStop:anim:flag
委托方法中推送/弹出,但是在标志设置为true的情况下永远不会调用它。
我假设在调用委托方法之前释放segue。我还能做什么?
答案 0 :(得分:5)
如果我完全误解了这个问题,请原谅我,但似乎你只想在两个视图控制器之间来回做一个基本的水平翻转。即使你已经想到这一点,也许它会帮助其他有同样问题的人。
(1)在你的故事板(有ViewController A& B)中,从A到B创建一个模态Segue。给它一个标识符(showViewControllerB)并选择Transition:Flip Horizontal。
我们设置了协议并委托:
(2a)在ViewControllerB.h中添加@interface:
@class ViewControllerB;
@protocol ViewControllerBDelegate
- (void)viewControllerBDidFinish:(ViewControllerB *)controller;
@end
(2b)将委托添加为属性:
@property (weak, nonatomic) id <ViewControllerBDelegate> delegate;
(3a)在ViewControllerB.m中合成:
@synthesize delegate;
(3b)并在方法中委托翻转:
- (IBAction)flipBack:(id)sender
{
[self.delegate viewControllerBDidFinish:self];
}
(4)在ViewControllerA.h中,在最顶层#import "ViewControllerB.h"
和@interface <ViewControllerBDelegate>
(5a)在ViewControllerA.m中添加符合协议的方法:
- (void)viewControllerBDidFinish:(ViewControllerB *)controller
{
[self dismissModalViewControllerAnimated:YES];
}
(5b)然后将其设置为prepareForSegue:
中的委托- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"showViewControllerB"]) {
[[segue destinationViewController] setDelegate:self];
}
}
我希望这能回答你的问题。如果我误解了,请告诉我。
答案 1 :(得分:0)
你的问题有点令人困惑,因为混合弹出,推动,翻转和后空翻。我不确定ai是否可以回答你的问题,但我能说出我做了什么。
如果我将viewController推入导航控制器堆栈并将Storyboard Segue Style设置为Push,它将从右向左推入视图。出现一个后退按钮,并显示其中的presentsViewController的标题。
如果我将Storyboard Segue Style设置为Modal,我可以将Transition设置为Flip Horizontal(看起来像你想要的那样)。但是没有后退按钮会出现。在presentViewController中,我用以下方法关闭视图:
[self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
它将向右翻转翻转第二个视图。
但这是一个肮脏的解决方案,并不是苹果推荐的。
Luke Dubert向您举例说明了如何实现委托。