2013-03-19 11 views
8

Pracuję nad aplikacją iOS z najnowszym pakietem SDK.Orientacja pozioma, ale wartości w pionie ramki?

Ustawiłem orientację poziomą krajobrazu jako unikalną dostępną orientację i mam pytanie dotyczące widoku viewController.

To jest mój kod:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(deviceOrientationDidChange:) 
               name:UIDeviceOrientationDidChangeNotification 
               object:nil]; 
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation != AVCaptureVideoOrientationLandscapeRight); 
} 

- (void)deviceOrientationDidChange:(NSNotification*)notification 
{ 
    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; 
    if (orientation == AVCaptureVideoOrientationLandscapeLeft) 
     NSLog(@"Orientation: Landscape Left"); 
    else if (orientation == AVCaptureVideoOrientationLandscapeRight) 
     NSLog(@"Orientation: Landscape Right"); 
    NSLog(@"FRAME: %@", NSStringFromCGRect(self.view.frame)); 
} 

I to jest dziennik, który pojawia się:

Orientation: Landscape Right 
FRAME: {{0, 0}, {320, 568}} 
Orientation: Landscape Right 
FRAME: {{0, 0}, {320, 568}} 

Moje pytanie jest o {{0, 0}, {320, 568}}:

Dlaczego otrzymuję te wartości?

Myślę, że prawidłowe wartości to {{0, 0}, {568, 320}}.

+0

moje przypuszczenie jest jego pełnoekranowy VideoController ci wyświetlają się, gdy aplikacja jest nadal portretowana. –

+0

Testowałem program za pomocą symulatora i pojawia się on w orientacji poziomej. I tak, jest to aplikacja pełnoekranowa. – VansFannel

+0

Nie powinieneś słuchać zmian orientacji urządzenia. 'UIViewController' ma odpowiednie metody do słuchania zmian orientacji interfejsu. Dodaj swój kod logowania w odpowiednich metodach. Wypróbuj 'didRotateFromInterfaceOrientation:' lub 'viewDidLayoutSubviews'. – rmaddy

Odpowiedz

3

Uważam, że ramki rects nie reagują na zmiany orientacji.

EDYCJA: Moje oryginalne rozwiązanie było zbyt skomplikowane dla twoich potrzeb. Jeśli prawidłowo znajdujesz aktualną orientację, zinterpretuj szerokość prostokąta jako wysokość, jeśli jesteś w trybie poziomym.

+0

Tak myślę. Dzięki za odpowiedź. – VansFannel

+1

Proszę spojrzeć na odpowiedź na to pytanie: http://stackoverflow.com/questions/2686882/incorrect-frame-window-size-after-re-orientation- in-microphone. Lepiej używać granic zamiast ramki. – VansFannel

+1

Ah, bardzo fajnie! Nie znalazłem tej odpowiedzi, gdy szukałem w tej sprawie. Wrócę do mojego kodu i zobaczę, czy to działa. Jest zdecydowanie bardziej elegancki. – drewmm

1

Dodaję to rozwiązanie, aby pokazać, co dzieje się z ramką i oprawą.

Dodałem te trzy sposoby:

- (void) viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
     CGRect bounds = [view bounds]; 
     NSLog(@"FRAME: %@", NSStringFromCGRect(view.frame)); 
     NSLog(@"BOUNDS: %@", NSStringFromCGRect(bounds)); 
} 

- (void)deviceOrientationDidChange:(NSNotification*)notification 
{ 
    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; 
    if (orientation == AVCaptureVideoOrientationLandscapeLeft) 
     NSLog(@"1. Orientation: Landscape Left"); 
    else if (orientation == AVCaptureVideoOrientationLandscapeRight) 
     NSLog(@"1. Orientation: Landscape Right"); 
    NSLog(@"1. FRAME: %@", NSStringFromCGRect(self.view.frame)); 
    NSLog(@"1. BOUNDS: %@", NSStringFromCGRect(self.view.bounds)); 
} 

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
{ 
    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; 
    if (orientation == AVCaptureVideoOrientationLandscapeLeft) 
     NSLog(@"2. Orientation: Landscape Left"); 
    else if (orientation == AVCaptureVideoOrientationLandscapeRight) 
     NSLog(@"2. Orientation: Landscape Right"); 
    NSLog(@"2. FRAME: %@", NSStringFromCGRect(self.view.frame)); 
    NSLog(@"2. BOUNDS: %@", NSStringFromCGRect(self.view.bounds)); 
} 

- (void)viewDidLayoutSubviews 
{ 
    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; 
    if (orientation == AVCaptureVideoOrientationLandscapeLeft) 
     NSLog(@"3. Orientation: Landscape Left"); 
    else if (orientation == AVCaptureVideoOrientationLandscapeRight) 
     NSLog(@"3. Orientation: Landscape Right"); 
    NSLog(@"3. FRAME: %@", NSStringFromCGRect(self.view.frame)); 
    NSLog(@"3. BOUNDS: %@", NSStringFromCGRect(self.view.bounds)); 
} 

I to jest to, co mam:

FRAME: {{0, 0}, {320, 568}} 
BOUNDS: {{0, 0}, {320, 568}} 
3. Orientation: Landscape Right 
3. FRAME: {{0, 0}, {320, 568}} 
3. BOUNDS: {{0, 0}, {568, 320}} 
1. Orientation: Landscape Right 
1. FRAME: {{0, 0}, {320, 568}} 
1. BOUNDS: {{0, 0}, {568, 320}} 
1. Orientation: Landscape Right 
1. FRAME: {{0, 0}, {320, 568}} 
1. BOUNDS: {{0, 0}, {568, 320}} 

Bound zmian na viewDidLayoutSubviews:.

0

Stosować self.view.bounds zamiast self.view.frame

0

Proszę zmienić zmiany na viewController

SKScene * scene = [MyScene sceneWithSize:skView.bounds.size]; 

zastąpić

SKScene * scene = [MyScene sceneWithSize:CGSizeMake(skView.frame.size.height, skView.frame.size.width)]; 
+0

Witaj Soner, co edytujesz moją odpowiedź? – bhaveshvirani63