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:在横向模式下无法调整模式视图中的框架大小的主要内容,如果未能解决你的问题,请参考以下文章