这几周真的被困住了。我正在使用ECSlidingViewController,我想要一个视图,能够旋转到横向和纵向,因为它是一张风景照片,并且需要利用可用空间,而我不想要剩下的应用程序旋转,只是留在景观。
我确信自动旋转方法没有被调用,因为它使用这种技术切换到视图......
- (void)setTopViewController:(UIViewController *)theTopViewController
{
CGRect topViewFrame = _topViewController ? _topViewController.view.frame : self.view.bounds;
[self removeTopViewSnapshot];
[_topViewController.view removeFromSuperview];
[_topViewController willMoveToParentViewController:_topViewController];
[_topViewController removeFromParentViewController];
_topViewController = theTopViewController;
[self addChildViewController:self.topViewController];
[self.topViewController didMoveToParentViewController:self];
[_topViewController.view setAutoresizingMask:self.autoResizeToFillScreen];
[_topViewController.view setFrame:topViewFrame];
_topViewController.view.layer.shadowOffset = CGSizeZero;
_topViewController.view.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.view.layer.bounds].CGPath;
[self.view addSubview:_topViewController.view];
}
在我的initialviewcontroller上......
self.topViewController = [storyboard instantiateViewControllerWithIdentifier:@"Home"];
所以它只是堆叠在顶部,而不是切换到这个视图。所以,它总是在听初始视图控制器旋转方法......
非常感谢帮助,因为我说我已经被困了好几天......
答案 0 :(得分:1)
经过几个小时的挣扎,最终我可以做到这一点..
首先,您需要创建ECSLidingViewController
的子视图并输入以下代码:
-(NSUInteger)supportedInterfaceOrientations{
return [self.topViewController supportedInterfaceOrientations];
}
-(BOOL)shouldAutorotate{
return self.topViewController.shouldAutorotate;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{
return [self.topViewController preferredInterfaceOrientationForPresentation];
}
您还需要创建一个UINavigationController
类别并覆盖此代码
@implementation UINavigationController (Rotation_IOS6)
-(BOOL)shouldAutorotate{
return [[self.viewControllers lastObject] shouldAutorotate];
}
-(NSUInteger)supportedInterfaceOrientations{
return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{
return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}
@end
希望这对你有用..
答案 1 :(得分:0)
这是一个常见问题:如果您实例化一个视图控制器,通过addSubview
将其视图添加到另一个视图控制器的视图,那么第一个控制器将不会获得任何相关的自动旋转。
为了应对这个用例,Apple在iOS5中添加了所谓的 UIViewController
Containment ,您可以在其中添加子控制器到另一个控制器;然后所有相关方法(viewWillAppear/Disappear
;自动旋转方法等将自动路由到子控制器。)
以下是您可能需要致电的基本方法:
addChildViewController:
removeFromParentViewController
willMoveToParentViewController:
didMoveToParentViewController:
有关详细信息,请查看Implementing a Container View Controller。
Here您可以找到一个教程,为您提供有关如何使用遏制的分步说明。
请注意,这只适用于iOS> 5,所以如果你需要支持iOS4,那你就不走运了。在任何情况下,您可以尝试通过将相关消息中继到子控制器来构建变通方法。例如,在我的应用程序中,这是willAnimateRotationToInterfaceOrientation
和didRotateFromInterfaceOrientation
的样子:
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
duration:(NSTimeInterval)duration {
[self.mainButtonBarController willAnimateRotationToInterfaceOrientation:interfaceOrientation
duration:duration];
[self.boardController willAnimateRotationToInterfaceOrientation:interfaceOrientation
duration:duration];
}
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
[self.mainButtonBarController didRotateFromInterfaceOrientation:fromInterfaceOrientation];
[self.boardController didRotateFromInterfaceOrientation:fromInterfaceOrientation];
}
即,他们只是将相同的消息转发给子控制器。您可以对所需的其他方法(shouldAutorotate...
等)执行相同操作。