iOS 8中自定义UIWindows不能正确旋转

栏目: IOS · 发布时间: 7年前

内容简介:http://stackoverflow.com/questions/26706050/custom-uiwindows-do-not-rotate-correctly-in-ios-8

让您的应用程序进入横向模式并执行以下代码:

UIWindow *toastWindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
toastWindow.hidden = NO;
toastWindow.backgroundColor = [[UIColor cyanColor] colorWithAlphaComponent:0.5f];

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    [toastWindow removeFromSuperview];
});

在iOS 7中,您将获得透明的蓝色叠加层,整个屏幕顶部将在5秒钟后消失.在iOS 8中,您将获得一个透明的蓝色叠加层,覆盖了一半以上的屏幕

这显然与苹果在iOS 8中的变化有关,屏幕坐标现在是面向接口而不是面向设备,但是在真正的苹果时尚中,他们似乎在风景模式和旋转中遗留了无数的错误.

我可以通过检查设备方向是否是横向,并翻转主屏幕边框的宽度和高度来“修复”,但是当Apple在iOS 9中再次更改所有内容时,这似乎是一个可怕的黑客.

CGRect frame = [[UIScreen mainScreen] bounds];

if (UIInterfaceOrientationIsLandscape([UIDevice currentDevice].orientation))
{
    frame.size.width = frame.size.height;
    frame.size.height = [[UIScreen mainScreen] bounds].size.width;
}

UIWindow *toastWindow = [[UIWindow alloc] initWithFrame:frame];
toastWindow.hidden = NO;
toastWindow.backgroundColor = [[UIColor cyanColor] colorWithAlphaComponent:0.5f];

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    [toastWindow removeFromSuperview];
});

有没有人遇到这个问题,遇到一个更好,更不脆弱的解决方案?

编辑:我知道我只能使用UIView并将其添加到关键窗口,但我想把东西放在状态栏的顶部.

因为另一个原因,你的’修复’并不好,因为它实际上并没有旋转窗口,以便文本和其他子视图以适当的方向出现.换句话说,如果你想通过其他子视图来增强窗口,那么它们将被错误地导向.

在iOS8中,您需要设置窗口的rootViewController,并且该rootViewController需要从“shouldAutoRotate”和“supportedInterfaceOrientations”返回适当的值.还有一些关于这一点: https://devforums.apple.com/message/1050398#1050398

如果您的窗口没有rootViewController,您可以有效地告诉框架窗口不应该自动旋转.在iOS7中,这并没有什么不同,因为框架并没有为你做这个工作.在iOS8中,该框架正在处理旋转,并且它认为它在您限制窗口的边界时正在执行您所请求的(通过使用nil rootViewController).

尝试这个:

@interface MyRootViewController : UIViewController
@end

@implementation MyRootViewController

- (UIInterfaceOrientationMask)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAll;
}

- (BOOL)shouldAutorotate
{
    return YES;
}

@end

现在,在实例化之后,将rootViewController添加到您的窗口中:

UIWindow *toastWindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
toastWindow.rootViewController = [[MyRootViewController alloc]init];

http://stackoverflow.com/questions/26706050/custom-uiwindows-do-not-rotate-correctly-in-ios-8


以上所述就是小编给大家介绍的《iOS 8中自定义UIWindows不能正确旋转》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

离散数学及其应用(原书第6版·本科教学版)

离散数学及其应用(原书第6版·本科教学版)

[美] Kenneth H. Rosen / 袁崇义、屈婉玲、张桂芸 / 机械工业出版社 / 2011-11 / 49.00元

《离散数学及其应用》一书是介绍离散数学理论和方法的经典教材,已经成为采用率最高的离散数学教材,仅在美国就被600多所高校用作教材,并获得了极大的成功。第6版在前5版的基础上做了大量的改进,使其成为更有效的教学工具。 本书基于该书第6版进行改编,保留了国内离散数学课程涉及的基本内容,更加适合作为国内高校计算机及相关专业本科生的离散数学课程教材。本书的具体改编情况如下: · 补充了关于范式......一起来看看 《离散数学及其应用(原书第6版·本科教学版)》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

URL 编码/解码
URL 编码/解码

URL 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具