我有一个UINavigationController,其上有一个UIViewController(VC1)。 VC1包含一个collectionView。当用户点击一个单元格时,子视图控制器(VC2)被添加到VC1。
VC2应该支持所有方向。而VC1仅支持纵向。在纵向模式下,我希望能够呈现VC2,旋转到横向,让VC2相应调整其布局,关闭VC2,仍然在纵向/布局中显示VC1。
当使用stock方法呈现VC2时,VC2中的shouldAutorotate方法被调用。但这还不够,因为它不允许自定义转换:
(1)
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
CommentsViewController *vc = [[CommentsViewController alloc] initWithNibName:@"CommentsViewController" bundle:nil];
[self presentViewController:vc animated:YES completion:nil];
}
在将presentViewController:animated:completion:
与自定义转换或使用传统的viewController包含方法一起使用时,不会调用shouldAutorotate方法。换句话说,这些都不起作用:
(2)
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
CommentsViewController *vc = [[CommentsViewController alloc] initWithNibName:@"CommentsViewController" bundle:nil];
self.transitioningDelegate = [[TransitioningDelegate alloc] init];
vc.modalPresentationStyle = UIModalPresentationCustom;
vc.transitioningDelegate = self.transitioningDelegate;
[self presentViewController:vc animated:YES completion:nil];
}
(3)
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
CommentsViewController *vc = [[CommentsViewController alloc] initWithNibName:@"CommentsViewController" bundle:nil];
[self addChildViewController:vc];
vc.view.frame = self.view.bounds;
[self.view addSubview:vc.view]; // Assume I'm doing a cool custom animation here
[vc didMoveToParentViewController:self];
}
总之,使用方法#1可以正确调用旋转方法。但是使用#2和#3则不然。这禁止我构建所需的自定义转换,因为这样做意味着子viewController不支持所有方向。
非常感谢任何帮助。
对于背景:我精通iOS6 / 7轮换API,UIViewController包含和自定义viewController转换。
修改
我确实实施shouldAutomaticallyForwardRotationMethods
无济于事。
答案 0 :(得分:1)
所以,这可能不是你需要的,但是如果动画转换没有删除呈现视图控制器的视图,则呈现视图控制器似乎保持对shouldAutorotate调用的控制。如果您确实删除了呈现视图控制器的视图,那么shouldAutorotate调用的控制将移动到呈现的视图控制器。
我不确定如何在不删除视图的情况下自动发送控件(这样您可以显示透明视图),但您可以手动转发shouldAutorotate调用:
- (BOOL) shouldAutorotate{
if(self.presentedViewController){
return [self.presentedViewController shouldAutorotate];
}
return YES;
}
虽然不是最理想的。
答案 1 :(得分:-1)
您是否碰巧在父控制器上实现- (BOOL)shouldAutomaticallyForwardRotationMethods
并让它返回NO?
您的情况可能更复杂,因为您支持不同的父视图控制器和子视图控制器的不同旋转,但这很容易被遗漏。