添加到UIWindow中的UIView中的方向

我有一个应该覆盖整个设备(UIWindow),以支持图像放大/缩小效果的UIView,我正在使用核心animation,用户点击UITableViewCell上的button,然后缩放相关的图像。

缩放是完美的performance,我无法弄清楚为什么子视图仍然在肖像模式,即使设备在横向。 下面的插图:

在这里输入图像说明

我有一个导航控制器,但这个视图已经直接添加到UIWindow。

你可以在这里阅读一些可能的原因:
技术问答QA1688 – 为什么我的UIViewController不能随设备一起旋转?

在你的情况下,它可能是你添加视图作为另一个子视图的事实。 只有第一个子视图获取旋转事件。 你可以做的是将其添加为第一个窗口子视图的子视图。

UIWindow* window = [UIApplication sharedApplication].keyWindow; if (!window) window = [[UIApplication sharedApplication].windows objectAtIndex:0]; [[[window subviews] objectAtIndex:0] addSubview:myView]; 

问题

从iOS 6开始,只有最顶层的视图控制器(与UIApplication对象并排)参与决定是否响应设备方向的更改而旋转。

https://developer.apple.com/library/content/qa/qa1688/_index.html

解决scheme

我已经开源了一个名为AGWindowView的pod。
它会自动处理任何旋转和framechanges,所以你不必担心。

代码

它支持SDK和iOS系统版本的任意组合。 相关的代码可以在这里find: https : //github.com/hfossli/AGWindowView/blob/master/Source/AGWindowView.m

我在UIApplication上创build了一个类,它有一个帮助属性和获取keyWindow的第一个子视图的方法。 无论如何,这是您想叠加的视图。 现在,当您将一个由UIViewControllerpipe理的视图添加到该视图时,将调用shouldRotateToInterfaceOrientation:方法。

UIApplication的+ WindowOverlay.h

 #import <UIKit/UIKit.h> @interface UIApplication(WindowOverlay) @property (nonatomic, readonly) UIView *baseWindowView; -(void)addWindowOverlay:(UIView *)view; @end 

UIApplication的+ WindowOverlay.m

 #import "UIApplication+WindowOverlay.h" @implementation UIApplication(WindowOverlay) -(UIView *)baseWindowView{ if (self.keyWindow.subviews.count > 0){ return [self.keyWindow.subviews objectAtIndex:0]; } return nil; } -(void)addWindowOverlay:(UIView *)view{ [self.baseWindowView addSubview:view]; } @end 

这里是你将如何使用它。

 //at the top of the file...or in {yourproject}.pch #import "UIApplication+WindowOverlay.h //in a method: UIView *view = [UIView new]; UIView *window = [UIApplication sharedApplication].baseWindowView; view.frame = window.bounds; [window addSubview:view]; //or [[UIApplication sharedApplication] addWindowOverlay:view]; 

这是因为当你提到你的视图已经被直接添加到UIWindow,因此当导航控制器调用旋转的方法时,uiview没有任何反应。 如果它是视图控制器视图的子视图,则UIView将旋转。 如果由于某种原因,这是不能做到的。 那么你可以重写这个方法:

 // This method is called every time the device changes orientation - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations } 

每当你的方向改变也改变你的视angular。

我有一个类似的问题,直接将视图添加到窗口。 也许这将有助于: 在添加到窗口后自动调整UIView的大小

解决这个问题的另一个解决scheme。

定义当前的方向:

 @interface AJImageCollectionViewController (){ UIInterfaceOrientation _currentOrientation; } @end 

然后检查viewWillLayoutSubviews中的方向:

 - (void)viewWillLayoutSubviews { [self checkIfOrientationChanged]; } - (void)checkIfOrientationChanged { UIInterfaceOrientation newOrientation = [[UIApplication sharedApplication] statusBarOrientation]; BOOL newOrientationIsPortrait = UIInterfaceOrientationIsPortrait(newOrientation); BOOL oldOrientationIsPortrait = UIInterfaceOrientationIsPortrait(_currentOrientation); // Check if the orientation is the same as the current if(newOrientationIsPortrait != oldOrientationIsPortrait){ _currentOrientation = newOrientation; // Do some stuff with the new orientation } }