UIView中的方向添加到UIWindow

Ken*_*Ken 44 iphone orientation uiview uiwindow

我有这是应该覆盖整个设备(一个UIWindow)支持的图像放大/缩小效果我使用核心动画其中用户点击一个UITableViewCell按钮做一个UIView和我缩放相关联的图像.

缩放是完美无瑕的,我无法弄清楚的是,即使设备处于横向状态,子视图仍然处于纵向模式.下图说明:

在此输入图像描述

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

diz*_*izy 121

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

在您的情况下,可能是您将视图作为另一个子视图添加到窗口.只有第一个子视图才能获得旋转事件.您可以做的是将其添加为第一个窗口子视图的子视图.

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

  • 如果要在模式视图控制器(至少从iOS5开始)之前显示,则添加到第一个子视图将不起作用,因为模态视图控制器被添加为主UIWindow子视图上的第二个视图层次结构. (14认同)

hfo*_*sli 83

问题

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

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

解决方案

我已经开源了一个名为AGWindowView的pod .
它将自动处理任何旋转和帧更改,因此您不必担心这一点.

代码

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


Jon*_*Jon 5

我在 UIApplication 上创建了一个类别,它具有用于获取 keyWindow 的第一个子视图的辅助属性和方法。无论如何,这就是您想要覆盖的视图。现在,当您将由 UIViewController 管理的视图添加到该视图时,将调用 shouldRotateToInterfaceOrientation: 方法。

UIApplication+WindowOverlay.h

#import <UIKit/UIKit.h>

@interface UIApplication(WindowOverlay)

    @property (nonatomic, readonly) UIView *baseWindowView;

    -(void)addWindowOverlay:(UIView *)view;

@end
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

以下是您将如何使用它。

//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];
Run Code Online (Sandbox Code Playgroud)


Osc*_*mez 1

这是因为正如您提到的,您的视图已直接添加到 UIWindow 中,因此当为导航控制器调用旋转方法时,uiview 不会发生任何变化。如果 UIView 是视图控制器视图的子视图,它将旋转。如果由于某种原因无法做到这一点。然后你可以重写这个方法:

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

每次你的方向改变时,你的视角方向也会改变。