Лучшее решение, которое я нашел, - создать прозрачный вид контейнера, добавить этот контейнер в окно и поместить свое предупреждение внутри контейнера. Затем вы можете зарегистрироваться на UIApplicationWillChangeStatusBarOrientationNotification
, чтобы получать события вращения и трансформировать контейнер; это позволяет вам независимо управлять кадром оповещения:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
...
self.container = [[UIView alloc] initWithFrame:self.window.bounds];
[self.container addSubview:self.alertView];
[self.window addSubview:self.container];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(statusBarWillRotate:)
name:UIApplicationWillChangeStatusBarOrientationNotification
object:nil];
...
}
...
- (void)statusBarWillRotate:(NSNotification *)theNotification
{
CGFloat rotation = 0;
switch ([notification[UIApplicationStatusBarOrientationUserInfoKey] intValue])
{
case UIInterfaceOrientationLandscapeLeft:
rotation = -M_PI_2;
break;
case UIInterfaceOrientationLandscapeRight:
rotation = M_PI_2;
break;
case UIInterfaceOrientationPortraitUpsideDown:
rotation = M_PI;
break;
case UIInterfaceOrientationPortrait:
default:
rotation = 0;
break;
}
CGAffineTransform rotationTransform = CGAffineTransformMakeRotation(rotation);
CGSize rotatedSize = CGRectApplyAffineTransform(self.window.bounds, rotationTransform).size;
[UIView animationWithDuration:[UIApplication sharedApplication].statusBarOrientationAnimationDuration
animations:^{
self.container.transform = rotationTransform;
// Transform invalidates the frame, so use bounds/center
self.container.bounds = CGRectMake(0, 0, rotatedSize.width, rotatedSize.height);
self.container.center = CGPointMake(self.window.bounds.size.width / 2, self.window.bounds.size.height / 2);
}];
}
Вы можете, если вы действительно хотите, создать совершенно новое окно со свойством windowLevel
, установленным на UIWindowLevelAlert
, которое будет гарантировать, что окно остается выше всех других представлений, включая клавиатуру, но управление окнами становится немного сложнее. сложно. Вышеуказанное решение должно быть достаточно для большинства нужд.
Проблема с простым добавлением вида контроллера представления в окно состоит в том, что не гарантируется получение всех сообщений поворота и view[Will|Did][Disa|A]ppear:
сообщений, если только он не добавлен в контроллер вида иерархия через addChildViewController:
на контроллере корневого представления.