[self.view addSubview:_topViewController.view];自转问题

时间:2013-01-09 18:19:46

标签: iphone ios objective-c ios6 uideviceorientation

这几周真的被困住了。我正在使用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"];

所以它只是堆叠在顶部,而不是切换到这个视图。所以,它总是在听初始视图控制器旋转方法......

非常感谢帮助,因为我说我已经被困了好几天......

2 个答案:

答案 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,那你就不走运了。在任何情况下,您可以尝试通过将相关消息中继到子控制器来构建变通方法。例如,在我的应用程序中,这是willAnimateRotationToInterfaceOrientationdidRotateFromInterfaceOrientation的样子:

- (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...等)执行相同操作。