Я рассмотрел все вопросы до сих пор, и, похоже, ни один из них не ответил на этот вопрос.
Я создал UITabBarController и добавил к нему несколько контроллеров представления. Большинство видов просматривается в портретной ориентации, но один должен быть просмотрен в альбомной ориентации. Я не хочу использовать акселерометр или определять, когда пользователь поворачивает устройство, я просто хочу отображать вид в альбомном режиме, когда они выбирают этот вид на вкладке внизу.
Я хочу, чтобы при выборе этого элемента происходила обычная анимация, такая как выпадение вкладки, поворот представления и т. д., А при выборе другого представления происходило обратное.
Нет ли встроенного свойства или метода, чтобы сообщить системе, в какой ориентации отображать представление?
Насколько я могу судить, переопределение метода shouldautorotate ... абсолютно ничего не делает.
Тип ответа, который я бы НЕ оценил, - это "RTFM", потому что у меня уже есть, и любой, кто разработал для iPhone, знает, что очень мало полезного от M до F-ing R.





Почта на форуме, который может помочь. Короткий ответ: вам нужно вручную повернуть представление или контроллер после того, как представление было нарисовано, в методе viewWillAppear:
CGAffineTransform landscapeTransform = CGAffineTransformMakeRotation(degreesToRadian(90));
landscapeTransform = CGAffineTransformTranslate (landscapeTransform, +80.0, +100.0);
[[appDelegate navController].view setTransform:landscapeTransform];
В любом случае использование setStatusBarOrientation с этим кажется обходным решением.
Вот что я делаю для этого:
сначала поместите это определение в начало файла, прямо под #imports:
#define degreesToRadian(x) (M_PI * (x) / 180.0)
затем в методе viewWillAppear:
[[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO];
if (self.interfaceOrientation == UIInterfaceOrientationPortrait) {
self.view.transform = CGAffineTransformIdentity;
self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
self.view.bounds = CGRectMake(0.0, 0.0, 480, 320);
}
если вы хотите, чтобы это было анимировано, вы можете обернуть все это в блок анимации, например:
[UIView beginAnimations:@"View Flip" context:nil];
[UIView setAnimationDuration:1.25];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO];
if (self.interfaceOrientation == UIInterfaceOrientationPortrait) {
self.view.transform = CGAffineTransformIdentity;
self.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
self.view.bounds = CGRectMake(0.0, 0.0, 480, 320);
}
[UIView commitAnimations];
Переопределите метод ориентации в вашем классе контроллера и установите его в альбомную ориентацию следующим образом:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Overriden to allow any orientation.
return UIInterfaceOrientationIsLandscape(interfaceOrientation);
}
Просто и эффективно!
shouldAutorotateToInterfaceOrientation работает только в том случае, если все представления в tabbarcontroller или все контроллеры представлений в navigationcontroller согласны на вращение.
При этом не учитывается какая-либо анимация (вкладка, строка состояния и т. д.)