2015-03-24 13 views
5

Próbuję uzyskać widoczny obszar rysunku dla podklasy GLKViewController. W systemie iOS 7 wyznaczyłbym orientację, a następnie odpowiednio dostosował [UIScreen mainScreen] .bounds.size. Wtedy odejmowałbym wysokości navigationBar i statusBarFrame i voila! - rzeczywisty rozmiar mojego obszaru rysowania.viewWillTransitionToSize i nieprawidłowy navigationBar i statusBarFrame wysokości

Teraz staram się aktualizować na iOS 8 za pomocą metody viewWillTransitionToSize, jednak po obróceniu urządzenia (mam UIInterfaceOrientationMaskAll na), rozmiar, który jest przekazywany, jest nieprawidłowy. W rzeczywistości szerokość jest poprawna dla widoku, ale nie dla wysokości (która obejmuje wysokość paska nawigacji i wysokość paska stanu).

Widziałem kilka pytań na temat SO, które dotyczą, ale nic, co faktycznie zajmuje się tym problemem, a przynajmniej nic, co mi pomogło.

Nie wydaje mi się, że robi coś ciekawego, poprawcie mnie jeśli się mylę:

- (void)viewWillTransitionToSize : (CGSize) size 
     withTransitionCoordinator : (id<UIViewControllerTransitionCoordinator>) coordinator 
{ 
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; 

    NSLog(@"size changed : orig(%f,%f) mainScreen(%f,%f)", size.width, size.height, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height); 

    [self updateViews:size]; 
} 

wyjść za przejście do góry:

size changed : orig(568.000000,256.000000) mainScreen(320.000000,568.000000) 

gdzie wysokość przekazywane z viewWillTransitionToSize wygląda następująco:

320 - (2*32) = 256 

, a następnie następna rotacja do portretu:

size changed : orig(320.000000,536.000000) mainScreen(568.000000,320.000000) 

gdzie ta wysokość przekazywane z viewWillTransitionToSize się:

568 - 32 = 536 

dzieje się wysokość paska nawigacyjnego w układzie poziomym (jeśli nic nie znaczy).

Moje pytania brzmią: w jaki sposób viewWillTransitionToSize ma taki rozmiar? W jaki sposób bierze pod uwagę dodatkowe paski, które zmieniają rozmiary lub znikają w zależności od orientacji? A co najważniejsze, dlaczego używa tych niewłaściwych wysokości?

+0

jest to ten sam problem mam do czynienia teraz - i uzyskać dokładnie takie same numery jak otrzymujesz kiedy mój obraca się na ekranie, z tym samym rozbieżności (32 lub 64 punkty). Problem polega na tym, że używam argumentu "rozmiar", aby uzyskać nową wysokość i szerokość widoku, a następnie użyć tych liczb do obliczenia rozmiaru podglądu podrzędnego. – Natalia

Odpowiedz

12

Podczas przeglądania rozmiarów ramek widoku viewWillTransitionToSize:withTransitionCoordinationar: najprawdopodobniej otrzymasz ramki przed aktualizacją.

Lepsze wykorzystanie animateAlongsideTransition:completion: wewnątrz tej metody:

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator 
{ 
    [super viewWillTransitionToSize:size 
      withTransitionCoordinator:coordinator]; 


    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) 
    { 
      //update views here, e.g. calculate your view 
    } 
           completion:^(id<UIViewControllerTransitionCoordinatorContext> context) 
    { 
    }]; 
} 
+0

Tak - dziękuję, bardzo dobrze działało! Nadal nie do końca rozumiem, jak działa viewWillTransitionToSize. Dlaczego otrzymam ramki przed aktualizacją, gdy rozmiar wskazany w parametrach jest przenoszony na rozmiar? Czy brakuje mi czegoś oczywistego? Rozmiar po przejściu z pewnością nie jest starą ramą, ale nie jest to również odpowiednia ramka. – dragonflyesque

+0

Napotkałem dokładnie taki sam problem, jak opisujesz. Dziwne jest to, że gdy urządzenia obrócą się z krajobrazu do lewego, otrzymasz prawidłową ramkę. Problem występuje tylko podczas przechodzenia z krajobrazu do portretu i odwrotnie. – Tuslareb

+4

Dzieje się tak dlatego, że podczas obracania między portretem a krajobrazem (lub odwrotnie) nowa wysokość słupków nie jest jeszcze uwzględniona w parametrze size viewWillTransitionToSize.Ale krajobraz w lewo i krajobraz mają ten sam pasek nawigacji i wysokość paska narzędzi, więc w takim przypadku nie trzeba czekać, aż te paski zostaną zmienione. Cel C jest pełen tak trudnego biznesu, w którym trzeba użyć bloków ukończenia lub funkcji wysyłania, aby uzyskać odpowiedni czas. Dalekie od błahego i łatwe do przeoczenia. – marcelnijman

Powiązane problemy