Я решил это довольно легко в конце. Я перепробовал каждое предложение выше и все еще не получилось, так что это было мое решение:
В ViewController, который должен оставаться альбомным (влево или вправо), я слушаю изменения ориентации:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(didRotate:)
name:UIDeviceOrientationDidChangeNotification object:nil];
Тогда в didRotate:
- (void) didRotate:(NSNotification *)notification
{ if (orientationa == UIDeviceOrientationPortrait)
{
if (hasRotated == NO)
{
NSLog(@"Rotating to portait");
hasRotated = YES;
[UIView beginAnimations: @"" context:nil];
[UIView setAnimationDuration: 0];
self.view.transform = CGAffineTransformIdentity;
self.view.transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(-90));
self.view.bounds = CGRectMake(0.0f, 0.0f, 480.0f, 320.0f);
self.view.frame = CGRectMake(0.0f, 0.0f, 480.0f, 320.0f);
[UIView commitAnimations];
}
}
else if (UIDeviceOrientationIsLandscape( orientationa))
{
if (hasRotated)
{
NSLog(@"Rotating to lands");
hasRotated = NO;
[UIView beginAnimations: @"" context:nil];
[UIView setAnimationDuration: 0];
self.view.transform = CGAffineTransformIdentity;
self.view.transform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(0));
self.view.bounds = CGRectMake(0.0f, 0.0f, 320.0f, 480.0f);
self.view.frame = CGRectMake(0.0f, 0.0f, 320.0f, 480.0f);
[UIView commitAnimations];
}
}
Имейте в виду любые Super Views / Subviews, которые используют автоматическое изменение размера, так как view.bounds / frame явно сбрасывается ...
Единственное предостережение этого метода для сохранения ландшафта вида - это внутреннее переключение анимации между ориентациями, которое должно произойти, когда было бы лучше, чтобы оно казалось без изменений.