5

Moja aplikacja ma jeden kontroler widoku, który nie może zmienić orientacji. Pomyśl o tym jako o polu gry, które musi pozostać niezmienione.Wymuszenie użycia arkusza UIActionSheet w określonej orientacji

Teraz chcę wstawić arkusz UIActionSheet, ale biorąc pod uwagę sposób, w jaki użytkownik trzyma urządzenie, chciałbym dopasować arkusz do orientacji.

Wygląda na to, że UIActionSheet, w przeciwieństwie do, powiedzmy, MFComposerViewController, nie otrzymuje orientacji z paska stanu, który obracam w oparciu o orientację, ale otrzymuje orientację od kontrolera widoku. Innymi słowy, UIActionSheet pojawia się w orientacji pionowej, niezależnie od sposobu trzymania urządzenia.

Próbowałem:

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; 

I udało się uzyskać właściwą orientację, ale otrzymany arkusz działanie pojawia się od strony pionowej i ma takie wymiary, jak gdyby był nadal w orientacji pionowej. Ramka arkusza działania jest obliczana na podstawie liczby przycisków itp.

Czy ktoś zdołał wymusić prawidłowe wyświetlanie arkusza UIActionSheet w określonej orientacji?

(Próbowałem również utworzyć nowy widok, który został przekształcony i miał prawidłowy rozmiar, ale UIActionSheet go zignorował.Następstwem pozostaje utworzenie nowego kontrolera UIViewController, który automatycznie się obraca, a UIActionSheet będzie jego dzieckiem. Oznacza to, że moje pole gry zostanie całkowicie zasłonięte przez nowy kontroler widoku.)

Odpowiedz

7

Okazuje się, że odpowiedź była dość prosta. Dodaj ten kod, aby wymusić UIActionSheets do orientacji co chcesz:

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 jest wielokrotnością pi/2, która w tym przypadku I uratował od czasu ostatniego orientacja została zmieniona.

+2

nie działa na mnie w iOS 6 – SpaceDog

+0

Masz rację. iOS 6 zepsuł to. Szukam obejścia. – mahboudz

+2

iOS 6 zepsuł wiele rzeczy, na przykład autorotację, szczególnie jeśli kompilujesz dla 4.x i uruchamiasz go na urządzeniu 6.x.Niektóre aplikacje po prostu nie działają automatycznie zgodnie z oczekiwaniami. Prawdopodobnie problem z łamaniem kodu i ten autorotate stuff ma jakiś związek. – SpaceDog

0

Sprawdź tę opcję ->JonasGessner/JGActionSheet, jeśli nie masz nic przeciwko podstawowemu układowi lub możesz go zmodyfikować w kodzie src.

To działało dla mnie na iOS 8.0.2. Tak jak poniżej:

  1. Dołącz to do swojego projektu.

Kopiowanie JGActionSheet.h i JGActionSheet.m do projekcji

  1. importu to gdzie masz zamiar użyć arkusza działania.

#import "JGActionSheet.h"

  1. niego korzystać.

Przykładowy kod:

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]; 
Powiązane problemy