【发布时间】:2014-11-03 00:14:02
【问题描述】:
让您的应用程序进入横向模式并执行以下代码:
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 中,您将获得一个覆盖一半多一点屏幕的透明蓝色覆盖层
这显然与 Apple 在 iOS 8 中所做的更改有关,其中屏幕坐标现在面向界面而不是面向设备,但在真正的 Apple 时尚中,它们似乎在横向模式和旋转中留下了无数错误。
我可以通过检查设备方向是否为横向并翻转主屏幕边界的宽度和高度来“解决”这个问题,但这似乎是一个可怕的黑客行为,当 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 并将其添加到关键窗口,但我想在状态栏顶部放一些东西。
【问题讨论】:
-
文档中没有说明使用多个 UIWindows 是错误的。自 iOS 2 以来人们一直在使用它们。
-
我在你的代码中看不到任何脆弱的东西。你在说什么?如果您的抱怨是窗口没有自动布局......那么答案是使用视图而不是窗口。很简单。
-
这是 Apple 对 windows 的评价:“大多数 iOS 应用程序在其生命周期内只创建和使用一个窗口。[...] 但是,如果应用程序支持使用外部显示器进行视频输出, 它可以创建一个附加窗口来在该外部显示器上显示内容。所有其他窗口通常由系统创建”。换句话说,如果你超出了 Apple 推荐的 windows 使用范围,那么你就只能靠自己了,Apple 不会做任何事情来简化多个窗口的使用——它们也不会将自己排除在向后不兼容的更改之外。
-
说真的,我和 Reid 在一起,你从哪里得到这些信息?
UIWindowLevel自 iOS 2.0 和 iOS 7 以来,UIKit 中就提供了堆栈级别,使用此 API 的理由从未如此美好! -
@AbhiBeckert 说“大多数 iOS 应用程序只创建和使用一个窗口...”不是建议,只是事实陈述。 iOS 应用程序长期以来一直在使用多个 Windows,Apple 打破这一点应该被认为是他们的失败,而不是我们的失败。
标签: ios objective-c ios8 uiwindow