UIActionSheet не отображается должным образом в альбомном режиме

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

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

Я устанавливаю ориентацию строки состояния так ...

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft animated:NO];

Когда я нахожусь в «ландшафтном режиме», и строка состояния всегда отображается правильно. Если я показываю AlertView, он также отображается правильно. Затем я показываю такую ​​таблицу действий

UIActionSheet *as = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:@"Cancel Button" destructiveButtonTitle:nil otherButtonTitles: @"button", nil];    
as.actionSheetStyle = UIActionSheetStyleBlackOpaque;
[as showInView:self.view];
//[as showFromToolbar:toolbar];

Я также попытался отобразить его из делегата приложения и панели инструментов. Если я установил ориентацию строки состояния непосредственно перед отображением, она все равно не сработает. Я даже пробовал.

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeLeft];

Кто-нибудь знает, почему таблица действий может отображаться в неправильном положении, но с правильными элементами управления? Или как заставить таблицу действий отображаться в определенной позиции. Я бы предпочел не реализовывать свою собственную версию таблицы действий, чтобы она отображалась правильно.

Заранее спасибо.

Изменить / Решение: принудительно отображать лист действий в альбомной ориентации.

Вот как мне удалось заставить его работать, я создал альбомный вид и добавил его в свое главное окно вот так:

landscapeView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 480, 480)];
landscapeView.transform = CGAffineTransformMakeRotation((-1)*M_PI/2);
landscapeView.bounds = CGRectMake(0, 0, 480, 380);
[appDelegate.window addSubview:landscapeView];

а затем отобразил мой лист действий, как это

if (landscape) {
    [menu showInView:landscapeView];
} else {
    [menu showInView:self.view];
}

Большое спасибо tc. за то, что указали мне здесь правильное направление.


person katbyte    schedule 12.09.2010    source источник
comment
почему вы используете 380 вместо 320? CGRectMake(0, 0, 480, 380);   -  person mahboudz    schedule 12.11.2011
comment
просто любопытно: почему вы делаете это как (-1) * M_PI, чтобы сделать его отрицательным, когда вы можете просто указать это как -M_PI?   -  person Duck    schedule 02.11.2012
comment
@mahboudz: На данный момент не припомню, возможно, это опечатка.   -  person katbyte    schedule 10.12.2012
comment
@RubberDuck: ну, я просто не знал, что ты можешь это сделать! спасибо, что указали на это :)   -  person katbyte    schedule 10.12.2012


Ответы (2)


Общая «ориентация интерфейса» также включает в себя такие вещи, как текущее преобразование представления, все, что UIViewController считает текущей ориентацией, и, возможно, другие вещи; просто установить ориентацию строки состояния не всегда достаточно.

Автономное изображение в портретной ориентации?

person tc.    schedule 12.09.2010
comment
Большое спасибо за то, что указали мне в правильном направлении, это было не так, и я пытался показать это с альбомной панели инструментов, но это не сработало. Однако кажется, что добавление альбомной ориентации в окно приложения для его отображения работает отлично! - person katbyte; 12.09.2010
comment
Ewwwwwww;) быть готовым к его поломке странным и загадочным образом! - person tc.; 12.09.2010

У меня была аналогичная проблема. У меня была кнопка на панели инструментов, которая отображала лист действий. Код для отображения листа действий находился в моем rootViewController. Он неправильно отображается в ландшафтном режиме с этим кодом:

[actionSheet showInView:[self.view]];

Это изменение устранило проблему:

[actionSheet showInView:[self.navigationController view] ];

Кажется, что ActionSheet получает свою ориентацию из представления, переданного в ShowInView, и мой rootViewController был в портретном режиме, хотя мой текущий вид был в альбомном. По крайней мере, это моя теория.

person Dwayne Driskill    schedule 05.10.2010