您可以轻松地以编程方式添加转场(无需使用情节提要)。在源视图控制器头文件中:
@property (nonatomic, strong) UIStoryboardSegue *segue;
在源视图控制器实现文件中,相应地设置 segue 属性:
self.segue = [UIStoryboardSegue segueWithIdentifier:[NSString stringWithFormat:@"%lu", indexPath.item] source:self destination:[PlayerViewController sharedPlayerViewController] performHandler:^{
// Insert whatever; nothing is needed for a basic segue
}];
另外,在源视图控制器中,在prepareForSegue 方法中添加目标视图控制器设置和过渡:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// The code in this method both sets up the destination view controller and transitions to it; you could optionally do set up here only, and then transition in an overridden -(void)perform method. This way is more convenient.
[(PlayerViewController *)segue.destinationViewController setView:[PlayerView sharedPlayerView]];
PHAsset *phAsset = (PHAsset *)AppDelegate.assetsFetchResults[segue.identifier.integerValue];
[AppDelegate.cacheManager requestAVAssetForVideo:phAsset options:AppDelegate.videoOptions resultHandler:^(AVAsset * _Nullable asset, AVAudioMix * _Nullable audioMix, NSDictionary * _Nullable info) {
[[PlayerView sharedPlayerView] addSubview:[PlayerControls sharedPlayerControls]];
[[PlayerControls sharedPlayerControls] setDelegate:(PlayerViewController *)segue.destinationViewController];
[[PlayerView sharedPlayerView] addSubview:[AppDelegate playerControlsLabel]];
[(PlayerViewController *)segue.destinationViewController setupPlaybackForAsset:asset completion:^{
[((AssetsCollectionViewController *)sender).navigationController presentViewController:(PlayerViewController *)segue.destinationViewController animated:TRUE completion:^{
}];
}];
}];
}
另外,在源视图控制器实现文件的任意位置添加此行以执行转场:
[self prepareForSegue:self.segue sender:self];
可以在 IBAction 处理程序和其他任何地方调用 prepareForSegue 方法。
请注意,呈现目标视图控制器的代码引用了未在情节提要中设置的视图控制器;获取此代码的项目不使用情节提要。但这并不重要,因为 segue 代码 将是相同的。
还请注意,您不必以任何方式、形状或形式修改目标视图控制器。以编程方式创建展开转场(换句话说,建立在此处显示的单向转场):
@implementation RootNavigationController
- (UIStoryboardSegue*)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier {
return [toViewController segueForUnwindingToViewController:toViewController fromViewController:fromViewController identifier:identifier];
}
@结束
现在,这就是我在自己的应用中所做的;以下是其他人在不使用情节提要的情况下创建转场的做法(相对于根本没有情节提要):
- (void)presentSignupViewController {
// Storyboard ID
UIStoryboard *modalStoryboard = [UIStoryboard storyboardWithName:@"MyStoryboard" bundle:nil];
UINavigationController *navController = [modalStoryboard instantiateViewControllerWithIdentifier:@"MySignupViewController"];
MySignupViewController *controller = [navController viewControllers][0];
// Configure your custom view controller, e.g. setting delegate
controller.delegate = self;
// Show VC
navController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
BlurryModalSegue *segue = [[BlurryModalSegue alloc] initWithIdentifier:@"SignupScene" source:self destination:navController];
[segue perform];
}
区别仅在于perform和prepareForSegue的使用:当完全不使用storyboard时,你必须在performForSegue方法中调用你选择的过渡方法(push...或present...);但是,转换方法会被 perform 方法调用。
<iframe width="853" height="480" src="https://www.youtube.com/embed/y8Fu2PEO2zo?rel=0&amp;showinfo=0" frameborder="0" allowfullscreen></iframe>