在iOS中子视图控制器方向更改时如何旋转父视图控制器

时间:2013-07-24 13:14:38

标签: iphone ios ipad ios5 uiinterfaceorientation

我正在使用

在我的父视图控制器上显示子视图控制器
childView1 *viewController = [[childView1 alloc]initWithNibName:examTFVC_NIB bundle:nil row:gesture.view.tag productID:test_productID size:testsize Duration:duration];
            self.modalPresentationStyle = UIModalPresentationCurrentContext;
            self.view.alpha = 0.4f;
            viewController.view.backgroundColor = [UIColor clearColor];
            viewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
            [self presentViewController:viewController animated:YES completion:NULL];  

我在父视图控制器及其横向上显示透明视图控制器。 但问题是当我将设备从横向左侧更改为横向向右或从右向左更改时,我的子视图控制器方向更改但父视图控制器保持相同的方向。

当我没有显示子视图控制器时,我的父视图控制器方向会如何更改父视图控制器方向以及子视图?

有一件事我尝试通过编程将通知中心从子节点传递到父节点来改变方向。

在子视图控制器中

- (NSUInteger)supportedInterfaceOrientations
 {
NSUInteger supportedOrientations = UIInterfaceOrientationMaskLandscape;
[[NSNotificationCenter defaultCenter] postNotificationName:@"RotateParent"object:nil];

return supportedOrientations;
 }
 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight );
 }
 - (BOOL)shouldAutorotate
{

return YES;
}

在父视图控制器中

-(void)rotateParent:(NSNotification *)notification
{
CGAffineTransform transform = CGAffineTransformMakeRotation(-M_PI);
self.view.transform = transform;
NSLog(@"Parent rotate ");
 }

但是当我点击显示我的孩子超过父视图时,我的“rotateParent”方法默认执行一次。 任何其他解决方案

2 个答案:

答案 0 :(得分:3)

对于< iOS 6.0

在childView1中

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {

 [[NSNotificationCenter defaultCenter] postNotificationName:@"RotateParent"object:nil];
 return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft ||interfaceOrientation == UIInterfaceOrientationLandscapeRight );

 }

对于> iOS 6.0

 - (BOOL)shouldAutorotate
 {
      [[NSNotificationCenter defaultCenter] postNotificationName:@"RotateParent" object:nil];
      return YES;
  }
父视图中的

添加观察者通知,并根据当前方向旋转父视图,并使用适当的角度。

-(void)rotateParent:(NSNotification *)note{

 UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;
 CGFloat rotationAngle = 0;

 if (orientation == UIDeviceOrientationPortraitUpsideDown) rotationAngle = M_PI;
 else if (orientation == UIDeviceOrientationLandscapeLeft) rotationAngle = M_PI_2;
 else if (orientation == UIDeviceOrientationLandscapeRight) rotationAngle = -M_PI_2;

 [UIView animateWithDuration:0.5 animations:^{
    self.view.transform = CGAffineTransformMakeRotation(rotationAngle);
    self.view.transform = CGAffineTransformMakeRotation(rotationAngle);
    self.view.transform = CGAffineTransformMakeRotation(rotationAngle);
 } completion:nil];

//adjust view frame based on screen size

 if(orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight)
 {
     self.view.bounds = CGRectMake(0.0, 0.0, 480, 320);
 }
 else
 {
    self.view.bounds = CGRectMake(0.0, 0.0, 320, 480);
 }
}

如果您遇到任何问题,请与我联系。

答案 1 :(得分:0)

嘿,如果我已正确理解你的问题,那么你可能想从UIView查看这个极好的方法。

- (void)viewWillLayoutSubviews
  

当视图的边界发生变化时,视图会调整其位置   子视图。您的视图控制器可以覆盖此方法   视图之前的更改将显示其子视图。默认   这个方法的实现什么都不做。

因此,在您的子视图控制器的每次后续旋转之前都会调用此方法,您可以通过此方法向父视图控制器发布通知。