Принуждение UIActionSheet использовать определенную ориентацию - PullRequest
5 голосов
/ 12 ноября 2011

Мое приложение имеет один контроллер вида, который не может изменить ориентацию.Думайте об этом как об игровом поле, которое необходимо зафиксировать на месте.

Теперь я хочу создать UIActionSheet, но, учитывая то, как пользователь держит устройство, я бы хотел сопоставить лист сориентация.

Кажется, что UIActionSheet, в отличие, скажем, от MFComposerViewController, не получает свою ориентацию от StatusBar, который я вращаю на основе ориентации, но получает свою ориентацию от нижележащего контроллера представления.Другими словами, UIActionSheet выходит в портретной ориентации, независимо от того, как устройство удерживается.

Я пытался:

CGAffineTransform   t = CGAffineTransformMakeRotation(lastUIAngle);
[actionSheet setTransform:t];
if (UIInterfaceOrientationIsLandscape(lastOrientation))
    actionSheet.frame = CGRectMake(0, 0, 480, 320);
else 
    actionSheet.frame = CGRectMake(0, 0, 320, 480);
actionSheet.center = self.view.center;

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

Кто-нибудь сумел заставить UIActionSheet правильно отображаться в указанной ориентации?

(я также пытался создать новый вид,который был преобразован и имел правильный размер, но UIActionSheet проигнорировал его. Осталось только создать новый UIViewController, который автоматически поворачивается, и сделать UIActionSheet его дочерним элементом. Однако это означает, что мое игровое поле полностью затенено новымпросмотр контроллера.)

Ответы [ 2 ]

7 голосов
/ 12 ноября 2011

Оказывается, ответ был довольно прост. Добавьте этот код, чтобы заставить UIActionSheets выбрать любую ориентацию:

tempView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
tempView.transform = CGAffineTransformMakeRotation(lastUIAngle);
tempView.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
[self.view.window addSubview:tempView];

UIActionSheet *actionSheet = ...

[actionSheet showInView:tempView];

lastUIAngle - это кратное число pi / 2, которое, в данном случае, я сохранило с последнего изменения ориентации.

0 голосов
/ 17 октября 2014

Проверьте эту альтернативу -> JonasGessner / JGActionSheet , если вы не возражаете против базовой компоновки или можете изменить ее в коде src.

Это сработало для меня на iOS 8.00,2.Как показано ниже:

  1. Включите его в свой проект.

Скопируйте JGActionSheet.h и JGActionSheet.m в свой проект

Импортируйте его туда, где вы собираетесь использовать лист действий.

#import "JGActionSheet.h"

Используйте его.

Пример кода:

JGActionSheetSection *menuSection = [JGActionSheetSection sectionWithTitle:nil message:@"Select Food" buttonTitles:@[@"Hamburger", @"Toast", @"Rice"] buttonStyle:JGActionSheetButtonStyleDefault];
[menuSection setButtonStyle:JGActionSheetButtonStyleRed forButtonAtIndex:0];

JGActionSheetSection *cancelSection = [JGActionSheetSection sectionWithTitle:nil message:nil buttonTitles:@[@"Cancel"] buttonStyle:JGActionSheetButtonStyleCancel];

NSArray *sections = @[menuSection, cancelSection];
JGActionSheet *sheet = [JGActionSheet actionSheetWithSections:sections];

[sheet setButtonPressedBlock:^(JGActionSheet *sheet, NSIndexPath *indexPath) {
    [sheet dismissAnimated:YES];
}];

// Set specific orientation to action sheet
sheet.transform = CGAffineTransformMakeRotation(M_PI);

[sheet showInView:self.view animated:YES];
...