iOS:在横向模式下无法调整模式视图中的框架大小

Posted

技术标签:

【中文标题】iOS:在横向模式下无法调整模式视图中的框架大小【英文标题】:iOS: Not being able to resize frames in modal view when in landscape mode 【发布时间】:2014-03-11 19:29:15 【问题描述】:

我有包含 UICollectionView 的 UIViewController。单击任何 UICollectionViewCell 时,我会在模式视图中显示单元格的详细内容。我通过情节提要在模态视图中添加了对象(UILabel、UIImage 等)。当使用 NSNotificationCenter 更改设备方向时,我会调整框架的大小:

在模态控制器的viewDidLoad方法中:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
NSNotificationCenter* notifCenter = [NSNotificationCenter defaultCenter];
[notifCenter addObserver:self selector:@selector(orientationChanged) name:UIDeviceOrientationDidChangeNotification object:nil];

方向改变内容:

-(void) orientationChanged 
    if (UIDeviceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) 
        self.productImage.frame = CGRectMake(61, 5, 124, 138);
        self.siteLogo.frame = CGRectMake(61, 146, 124, 90);
        self.productName.frame = CGRectMake(220, 5, 150, 102);
        self.productPrice.frame = CGRectMake(220, 120, 124, 21);
    
    else 
        self.productImage.frame = CGRectMake(61, 5, 124, 138);
        self.siteLogo.frame = CGRectMake(61, 146, 124, 90);
        self.productName.frame = CGRectMake(20, 244, 207, 102);
        self.productPrice.frame = CGRectMake(61, 354, 124, 21);
    

现在,当我以纵向模式启动我的应用程序并单击任何 UICollectionViewCell 时,模态视图会正确显示,现在当我更改为横向模式时(不关闭模态视图),由于上述方法,我能够调整帧大小.

问题是当我以横向模式启动应用程序然后单击 UICollectionViewCell 时,模式视图以纵向模式显示。我希望它处于横向模式并正确调整帧大小。我尝试在 viewDidLayoutSubviews 和 viewDidAppear 中设置框架,但没有用。

viewDidLayoutSubviews 的内容:

-(void)viewDidLayoutSubviews
    self.productImage.autoresizingMask = 0;
    self.productPrice.autoresizingMask = 0;
    self.productName.autoresizingMask = 0;
    self.siteLogo.autoresizingMask = 0;
    if (UIDeviceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])) 
        self.productImage.frame = CGRectMake(61, 5, 124, 138);
        self.siteLogo.frame = CGRectMake(61, 146, 124, 90);
        self.productName.frame = CGRectMake(220, 5, 150, 102);
        self.productPrice.frame = CGRectMake(220, 120, 124, 21);
    
    else 
        self.productImage.frame = CGRectMake(61, 5, 124, 138);
        self.siteLogo.frame = CGRectMake(61, 146, 124, 90);
        self.productName.frame = CGRectMake(20, 244, 207, 102);
        self.productPrice.frame = CGRectMake(61, 354, 124, 21);
    

提前致谢。

【问题讨论】:

你试过用willRotateToInterfaceOrientation:duration: @AbhishekBedi 是的,我试过了,但结果还是一样。 您是否将didAutorotateToInterfaceOrientation 方法设置为YES。请张贴整个课程代码。希望你调用这样的方法:` [self.navigationController presentViewController:webVC animated:YES completion:^ ];` 也检查一下:***.com/a/12555205/667586 我在两个控制器之间添加了模态segue,并在 UICollectionView 的 didSelectItemAtIndexPath 方法中调用 performSegue 【参考方案1】:

根据https://***.com/a/12555205/667586

Modal ViewControllers 在 ios 6 中不再获得旋转调用:willRotateToInterfaceOrientation:duration:、willAnimateRotationToInterfaceOrientation:duration: 和 didRotateFromInterfaceOrientation: 方法不再在任何对其自身进行全屏演示的视图控制器上调用——例如那些被调用:presentViewController:animated:completion:.

您可以让呈现模态视图控制器的视图控制器通知它旋转。此外,现在您使用:presentViewController:animated:completion: 来呈现视图控制器。 presentModalViewController:animated: 已弃用,您在代码中使用。

编写此代码:在模态视图控制器中:

// Returns interface orientation masks.
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation NS_AVAILABLE_IOS(6_0)
return UIInterfaceOrientationLandscapeLeft;

在调用视图控制器中:

MyVC *webVC = [[MyVC alloc] init];
[self.navigationController presentViewController:myVC animated:YES completion:^
    [myVC shouldAutorotate];
];

【讨论】:

以上是关于iOS:在横向模式下无法调整模式视图中的框架大小的主要内容,如果未能解决你的问题,请参考以下文章

为纵向和横向模式调整 UIImage 的大小

嵌套 UIView 调整大小

ios7 iPad横向模式下的错误视图大小

添加子视图时,如果应用程序处于横向模式,则视图不会调整大小

iPad添加视图然后告诉它根据方向模式调整大小?

在拆分视图中,当应用程序以横向模式启动时如何将视图调整到屏幕