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

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

内容简介: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不能正确旋转》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Probability and Computing

Probability and Computing

Michael Mitzenmacher、Eli Upfal / Cambridge University Press / 2005-01-31 / USD 66.00

Assuming only an elementary background in discrete mathematics, this textbook is an excellent introduction to the probabilistic techniques and paradigms used in the development of probabilistic algori......一起来看看 《Probability and Computing》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具