Как я могу отобразить один UIView в альбомной ориентации?

До сих пор я смотрел на каждый вопрос, и, похоже, никто не отвечает на этот вопрос.

Я создал UITabBarController и добавил несколько контроллеров представления к нему. Большинство видов просматривается в портретной ориентации, но следует рассматривать в альбомной. Я не хочу использовать акселерометр или определять, когда пользователь поворачивает устройство, я просто хочу отображать вид в альбомной ориентации, когда они выбирают этот вид на вкладке внизу.

Я хочу, чтобы при выборе этого элемента появлялись обычные анимации, такие как выпадающая вкладка, вращение представления и т. Д., И наоборот, когда они выбирают другое представление.

Разве нет встроенного свойства или метода, чтобы сообщить системе, в какой ориентации отображать представление?

Переопределение метода mustautorotate ..., насколько я могу судить, абсолютно ничего не делает.

Тип ответа, который я НЕ оценил бы, это «RTFM», потому что у меня уже есть, и любой, кто до сих пор разрабатывал для iPhone, знает, что очень мало полезного M для F-ing R.

10.12.2008 17:27:45
4 ОТВЕТА
РЕШЕНИЕ

Сообщение на форуме , который может помочь. Короткий ответ: вы должны вручную повернуть свое представление или контроллер после того, как представление было нарисовано, в viewWillAppear: метод

CGAffineTransform landscapeTransform = CGAffineTransformMakeRotation(degreesToRadian(90));
landscapeTransform = CGAffineTransformTranslate (landscapeTransform, +80.0, +100.0);

[[appDelegate navController].view setTransform:landscapeTransform];
9
10.12.2008 17:34:17
При этом не учитывается анимация (вкладка, строка состояния и т. Д.)
Ed Marty 10.12.2008 17:56:06
Использование setStatusBarOrientation с этим в любом случае кажется обходным решением.
Ed Marty 5.01.2009 14:29:53

Вот что я делаю, чтобы сделать это:

во-первых, поместите это определение вверху вашего файла, прямо под #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];
9
21.01.2009 04:02:52

Переопределите метод Orientation в вашем классе контроллера и установите его в Landscape следующим образом:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{
    // Overriden to allow any orientation.
    return UIInterfaceOrientationIsLandscape(interfaceOrientation);
}

Просто и эффективно!

0
13.01.2012 21:06:20

shouldAutorotateToInterfaceOrientation работает только в том случае, если все представления в tabbarcontroller или все контроллеры представления в navigationcontroller согласуются на ротацию.

0
20.04.2012 15:28:42