0

真的被困了好几个星期。我正在使用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];
}

在我的初始视图控制器上......

self.topViewController = [storyboard instantiateViewControllerWithIdentifier:@"Home"];

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

非常感谢您的帮助,正如我所说,我已经被困了好几天了......

4

2 回答 2

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

希望这对你有用..

于 2013-09-10T11:59:16.993 回答
0

这是一个常见的问题:如果你实例化一个视图控制器,通过 将它的视图添加到另一个视图控制器的视图addSubview中,那么第一个控制器将不会得到任何与自动旋转相关的调用。

为了应对这种用例,Apple 在 iOS5 中添加了所谓的UIViewControllerContainment,您可以在其中将子控制器添加到另一个控制器;然后所有相关方法(viewWillAppear/Disappear; 自动旋转方法等将自动路由到子控制器)。

以下是您可能需要调用的基本方法:

addChildViewController:
removeFromParentViewController
willMoveToParentViewController:
didMoveToParentViewController:

查看实现容器视图控制器以获取详细信息。

在这里,您可以找到一个教程,该教程将为您提供有关如何使用遏制的分步说明。

请记住,这仅适用于 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...等)

于 2013-01-09T18:50:01.437 回答