Это тоже сводило меня с ума.Я сделал пару вещей, которые заставили его работать, но я не доволен своими решениями - 1) Я не очень понимаю это и 2) это кажется хакерским.
Я добавил это в свое приложениеделегат (мой файл .m):
@interface UITabBarController (MyApp)
@end
@interface UINavigationController (MyApp)
@end
@implementation UITabBarController (MyApp)
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
return YES;
}
@end
@implementation UINavigationController (MyApp)
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
return YES;
}
@end
Это работало по большей части.Для видов, которые не вращались автоматически, мне пришлось вручную поворачивать виды, используя преобразования.Я сделал что-то вроде:
- (void)deviceOrientationDidChangeWithAnimation:(BOOL)animated {
UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
if (orientation == oldOrientation) {
return;
}
if (animated) {
CGFloat duration = [UIApplication sharedApplication].statusBarOrientationAnimationDuration;
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:duration];
[UIView setAnimationDidStopSelector:@selector(orientationChanged)];
}
[self sizeToFitOrientation:YES];
if (animated) {
[UIView commitAnimations];
}
oldOrientation = orientation;
}
- (CGAffineTransform)transformForOrientation {
UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
if (orientation == UIInterfaceOrientationLandscapeLeft) {
return CGAffineTransformMakeRotation(M_PI*1.5); // rotated CCW
} else if (orientation == UIInterfaceOrientationLandscapeRight) { // CW
return CGAffineTransformMakeRotation(M_PI/2);
} else if (orientation == UIInterfaceOrientationPortraitUpsideDown) { // CCW
return CGAffineTransformMakeRotation(-M_PI);
} else { // CW
return CGAffineTransformIdentity;
}
}
- (void)sizeToFitOrientation:(BOOL)transform {
if (transform) {
self.view.transform = CGAffineTransformIdentity;
}
CGRect frame = [UIScreen mainScreen].applicationFrame;
CGPoint center = CGPointMake(frame.origin.x + ceil(frame.size.width/2), frame.origin.y + ceil(frame.size.height/2));
CGFloat width = frame.size.width - 0 * 2;
CGFloat height = frame.size.height - 0 * 2;
UIInterfaceOrientation _orientation = [UIApplication sharedApplication].statusBarOrientation;
if (UIInterfaceOrientationIsLandscape(_orientation)) {
self.view.frame = CGRectMake(0, 0, height, width);
} else {
self.view.frame = CGRectMake(0, 0, width, height);
}
self.view.center = center;
if (transform) {
self.view.transform = [self transformForOrientation];
}
}
Надеюсь, это поможет!И если кто-то может указать на ошибки, которые я сделал (или на плохие вещи, которые я увековечиваю), я был бы счастлив узнать.:)