2013-10-03 10 views
5

Mam ViewController z kontrolerem nawigacyjnym i kontrolerem paska kart. Ten ViewController ma 2 przyciski, które przełączają widoczność widoku przewijania i widoku mapy. Najważniejsze jest, aby te 2 przyciski zawsze pojawiały się w tym samym miejscu, niezależnie od orientacji lub widoku, który jest widoczny.Mapowanie w systemie iOS przechodzi pod pasek nawigacji, pasek stanu i kontroler paska kart

Problem polega na tym, że MapView nie będzie prawidłowo dopasowany do rozmiaru. Jeśli po prostu daję ramkę z self.view.bounds, przechodzi ona pod pasek nawigacji/pasek kart - w zasadzie zajmuje cały ekran. To wyrzuca lokalizację moich przycisków przełączania.

Zauważyłem, że mój ScrollView robi to samo (używając koloru tła i półprzezroczystego paska nawigacji), ale położenie podprzestrzeni na nim pozostaje w widocznym obszarze (między paskiem nawigacyjnym a paskiem kart). Więc kiedy dodaję przyciski przełączania, pokazują się we właściwym miejscu.

Po naciśnięciu przycisków przełączania, ponownie przypisuję nadrzędny widok przycisków do wyświetlanego widoku (ScrollView lub MapView). To zawsze działa w widoku przewijania, ale ze względu na pozycjonowanie, przechodzą one pod paskiem nawigacji, gdy wyświetlany jest MapView.

Próbowałem ręcznie utworzyć ramkę dla MapView, ale otrzymałem dziwne wyniki. Używam tego na ramie:

CGRect mapFrame = CGRectMake(
    0, 
    (self.navigationController.navigationBar.frame.size.height + [UIApplication sharedApplication].statusBarFrame.size.height), 
    self.view.frame.size.width, 
    (
    self.view.frame.size.height 
    - (self.navigationController.navigationBar.frame.size.height + [UIApplication sharedApplication].statusBarFrame.size.height + self.tabBarController.tabBar.frame.size.height) 
    ) 
); 

I wtedy ustawić auto rozmiaru maski

[self.mapView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin]; 

Ale z tego, jeśli wejdę do kontrolera widoku w trybie poziomym - w MapView jest na ekranie. Jeśli wchodzę w tryb portretu, a następnie obracam do pejzażu, górny margines jest wyłączony, ale około 10 punktów, więc nadal jest pod paskiem nawigacji (i ma widoczny margines między paskiem kart a spodem widoku mapy).

Jak mogę zrobić, aby widoki podrzędne MapView wyświetlały się tylko w widocznym regionie, takim jak ScrollView? Nie przeszkadza mi to, że sama mapa przechodzi pod paskiem nawigacji/paskiem na kartę

Odpowiedz

13

Ugh, znalazłem odpowiedź zaledwie kilka minut temu. Nie mam pojęcia, dlaczego jest to domyślne zachowanie na iOS 7, ale niestety, jest.

Rozwiązaniem jest dodanie tego do viewDidLoad na ViewController

[self setEdgesForExtendedLayout:UIRectEdgeNone]; 
[self setAutomaticallyAdjustsScrollViewInsets:NO]; 

Dużo dzięki to the post here

+0

należy oznaczyć to jako odpowiedź też. :) Dzięki za pomoc. – James

+0

Dzięki twojemu rozwiązaniu. – jhondge