在iOS 8.1设备和模拟器中,如果从UIAlertController
呈现视图,则会将警报移到屏幕左上角的有错误的位置。
我们在一个应用程序中注意到了这一点,当我们尝试从当前“最顶部”的视图呈现视图时。如果UIAlertController
恰好是最顶部的视图,就会出现这种行为。我们已经改变了我们的代码,简单地忽略UIAlertControllers
,但我发帖是为了帮助其他遇到同样问题的人(因为我找不到任何东西)。
我们已将此隔离为一个简单的测试项目,完整的代码在本问题底部。
- 在新的Single View Xcode项目中的View Controller上实现
viewDidAppear:
。 - 呈现
UIAlertController
警报。 - 警报控制器立即调用
presentViewController:animated:completion:
来显示并解除另一个视图控制器:
当presentViewController:...
动画开始时,UIAlertController
就会被移动到屏幕左上角:
当dismissViewControllerAnimated:
动画结束时,警报已经被移动到屏幕左上角更远的位置:
完整代码:
- (void)viewDidAppear:(BOOL)animated {
// Display a UIAlertController alert
NSString *message = @"This UIAlertController will be moved to the top of the screen if it calls `presentViewController:`";
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"UIAlertController iOS 8.1" message:message preferredStyle:UIAlertControllerStyleAlert];
[alert addAction:[UIAlertAction actionWithTitle:@"I think that's a Bug" style:UIAlertActionStyleCancel handler:nil]];
[self presentViewController:alert animated:YES completion:nil];
// The UIAlertController should Present and then Dismiss a view
UIViewController *viewController = [[UIViewController alloc] init];
viewController.view.backgroundColor = self.view.tintColor;
[alert presentViewController:viewController animated:YES completion:^{
dispatch_after(0, dispatch_get_main_queue(), ^{
[viewController dismissViewControllerAnimated:YES completion:nil];
});
}];
// RESULT:
// UIAlertController has been moved to the top of the screen.
// http://i.imgur.com/KtZobuK.png
}
以上代码中是否存在任何可能导致此问题的内容?是否存在其他替代方案,可以无错误地显示UIAlertController中的视图?
rdar://19037589
http://openradar.appspot.com/19037589