2013-10-02 16 views
54

Mam UITabbarController z UINavigationController w nim. Mam podklasę UIView, którą przypiszę jako view z UIViewController w navController. To dość standardowe rzeczy, prawda? Oto jak to zrobićDlaczego UIViewController rozszerza się pod UINavigationBar, a UITableViewController nie?

_productCategoryView = [[ProductCategoryView alloc] initWithFrame:self.view.frame]; 
self.view = _productCategoryView; 

view ten ma UITableView jak subView

_productCategoryTableView = [[UITableView alloc] initWithFrame:self.frame style:UITableViewStylePlain]; 
_productCategoryTableView.separatorStyle = UITableViewCellSeparatorStyleNone; 
_productCategoryTableView.backgroundColor = [UIColor clearColor]; 
[self addSubview:_productCategoryTableView]; 

Dla debugowania Mam ustawienie self.backgroundColor = [UIColor blueColor] na widoku.

Z powyższej inicjalizacji tableView można pomyśleć, że widok i tabela frame jest taka sama. Jednak po uruchomieniu w iOS 7, pochodzenie widoku jest ustawione za UINavigationBar. Jest to zrozumiałe, ponieważ ustawiam self.navigationBar.translucent = YES; w mojej podklasie UINavigationController. Ale nie rozumiem, jak to jest, gdy stół siedzi tuż pod navBar? Czy nie powinien on również zaczynać się od (0, 0), która znajduje się za navBar? Zobacz zrzut ekranu Scenario 1 poniżej. Zauważ, niebieski odcień za navBar

Scenario 1

Teraz push inny viewController na stosie nawigacji, po prostu za pomocą [self.navigationController pushViewController.....]. Ponownie mam niestandardowy UIView z tableView w nim. Jednak mam również UILabel powyżej tej tabeli, i ponownie do debugowania, dałem mu redColor. Tym razem ja ustawiania etykiety origin się prawie tak samo jak widok na

CGRect boundsInset = UIEdgeInsetsInsetRect(self.bounds, UIEdgeInsetsMake(10, 10, 10, 10)); 

CGSize textSize = [_titleLabel.text sizeWithFont:_titleLabel.font 
           constrainedToSize:CGSizeMake(boundsInset.size.width, MAXFLOAT) 
            lineBreakMode:NSLineBreakByWordWrapping]; 
printSize(textSize); 
_titleLabel.frame = CGRectMake(boundsInset.origin.x, 
           boundsInset.origin.y, 
           boundsInset.size.width, 
           textSize.height); 

Więc, idąc przez logikę powyżej, etykieta powinna być widoczna, prawda? Ale tym razem tak nie jest. Tym razem etykieta znajduje się za numerem navBar.

Scenario - 2

Wskazówka czerwona barwa za pasek nawigacyjny.

Naprawdę chciałbym dostosować subView poniżej navBar konsekwentnie. Moje pytania są

1. How is the tableView offset by 64pixels (height of nav + status bar in iOS 7) automatically, even though it's frame is same as the view's?

2. Why does that not happen in the second view?

+0

Budujesz za pomocą Xcode 5 i SDK iOS7 ? –

Odpowiedz

128

Domyślnie widoki UITableViewController są automatycznie wstawka w iOS7 tak, że nie rozpocznie poniżej paska nawigacji bar/stanu. Jest to kontroler za pomocą ustawienia "Dostosuj wstawki widoku przewijania" na karcie Inspektora atrybutów narzędzia UITableViewController w konstruktorze interfejsów lub metody UIViewController za pomocą metody setAutomaticallyAdjustsScrollViewInsets:.

Jeśli chcesz, aby zawartość UIViewController nie była zgodna z zawartością jego widoku pod górnymi/dolnymi pasami, możesz użyć opcji Wydłuż krawędzie pod słupkami/pod dolnymi pasami w Konstruktorze interfejsu. Jest to dostępne za pośrednictwem właściwości edgesForExtendedLayout.

+48

Dzięki @Greg. ustawienie 'self.edgesForExtendedLayout = UIRectEdgeNone;' załatwiło sprawę. – unspokenblabber

+0

Dzięki. Adresowanie krawędziForExtendedLayout zakończone rozwiązało dla mnie problem z układem uitableview do podglądu navcontroller; spędził niezliczone godziny na tym przez ostatnie 8 miesięcy. – ObjectiveTC

+1

Podczas przeprowadzania przełączania wypychania za pomocą elementu navigationController zauważyłem, że na pasku nawigacyjnym zastosowano "opóźnioną" obróbkę kolorów. Co to powoduje i jak go usunąć? – ArdenDev

89
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.edgesForExtendedLayout = UIRectEdgeNone; 
} 

Swift 2:

self.edgesForExtendedLayout = UIRectEdge.None 

Swift 3:

self.edgesForExtendedLayout = [] 
+0

poprawne, dziękuję! –

+1

Najbardziej przydatna odpowiedź. – yujean

+0

Ustawienie 'self.edgesForExtendedLayout = []' zmienia kolor 'UINavigationBar'. – Hemang

9

@ odpowiedź gank jest poprawna, ale najlepszym miejscem, aby to zrobić jest na UINavigationControllerDelegate (jeśli posiadasz) :

func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) { 
    viewController.edgesForExtendedLayout = UIRectEdge.None 
} 
+2

Pozwala to uniknąć niestandardowego kontrolera super widoku. Ale fajnie. – Jaybo

+0

@Jaybo dzięki, tak, gdzie umieszczasz kod ma duże znaczenie. –

Powiązane problemy