2014-12-11 14 views
12

UIViewController z UIView i UITableViewUstawianie layoutMargins z UIView nie działa

UIView 
|-UITableView 

Próbuję marginesie konfiguracji jak poniżej:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.view.layoutMargins = UIEdgeInsetsMake(30, 30, 30, 30); 
    self.tableView.preservesSuperviewLayoutMargins = YES; 
    [self.view layoutIfNeeded]; 
} 

ale nic nie dzieje się na widoku.

Oto ograniczenia z InterfaceBuilder

(lldb) po self.view.constraints 
<__NSArrayM 0x786ab6e0>(
<NSLayoutConstraint:0x7896e940 UIView:0x7896e470.trailingMargin == UITableView:0x79b51a00.trailing - 16>, 
<NSLayoutConstraint:0x7896e970 UITableView:0x79b51a00.leading == UIView:0x7896e470.leadingMargin - 16>, 
<NSLayoutConstraint:0x7896e9a0 V:[_UILayoutGuide:0x7896e510]-(0)-[UITableView:0x79b51a00]>, 
<NSLayoutConstraint:0x7896e9d0 V:[UITableView:0x79b51a00]-(0)-[_UILayoutGuide:0x7896e600]>, 
<_UILayoutSupportConstraint:0x7896c7d0 V:[_UILayoutGuide:0x7896e510(0)]>, 
<_UILayoutSupportConstraint:0x7896c2b0 V:|-(0)-[_UILayoutGuide:0x7896e510] (Names: '|':UIView:0x7896e470)>, 
<_UILayoutSupportConstraint:0x7896cbf0 V:[_UILayoutGuide:0x7896e600(0)]>, 
<_UILayoutSupportConstraint:0x7896ea00 _UILayoutGuide:0x7896e600.bottom == UIView:0x7896e470.bottom> 
) 

wyniku nie widać żadnych marginesów, nic się nie zmieniło w ogóle .... co mam Issinga?

iOS 8

+0

Co zrobić, jeśli używasz 'setNeedsUpdateConstraints' przed wywołaniem' layoutIfNeeded'?Mam wrażenie, że zmiana 'layoutMargins' nie oznacza ograniczeń jako brudnych. – Andy

+0

Zobacz [tutaj] (https://stackoverflow.com/a/34690543/5175709). Istnieje rozwiązanie inne niż iOS11. Jestem pewien, że jeśli jest to zalecane ... – Honey

Odpowiedz

31

niestandardowe layoutMargins nie działają na widoku, który jest korzeniem do instancji UIViewController. Te są zdefiniowane przez system i nie można ich przesłonić. Trzeba dodać inny podrzędny, które obejmą całą zawartość można następnie modyfikować marginesy układ na tej nowej „contentView”

Aktualizacja:

Dyskusja

pomocą tej właściwości określić żądaną ilość miejsca (mierzoną w punktach) między krawędzią widoku a dowolnymi podgrupami. Układ automatyczny wykorzystuje marginesy jako wskazówki do umieszczania treści. W przypadku przykładu , jeśli określisz zestaw ograniczeń poziomych, używając ciągu formatu "| - [subview] - |", lewa i prawa krawędź subprofilu są wstawione od krawędzi superwizji przez odpowiednie marginesy . Jeśli krawędź widoku znajduje się blisko krawędzi widoku supervisora, a właściwość preservesSuperviewLayoutMargins ma wartość YES, rzeczywiste marginesy układu mogą zostać zwiększone, aby zapobiec nakładaniu się na siebie marginesów widoku z podglądu z poziomu .

Domyślne marginesy to osiem punktów z każdej strony.

Jeśli widok jest widokiem głównym kontrolera widoku, zestaw systemowy i zarządza marginesami. Górny i dolny margines są ustawione na zero punktów. Marginesy boczne różnią się w zależności od bieżącej klasy wielkości, ale może mieć 16 lub 20 punktów. Nie możesz zmienić tych marginesów.

+0

Nice - pracował jak urok! Czy masz na to źródło? Chciałbym przeczytać trochę więcej na ten temat. –

+1

Nie wiem, jak uzyskać link do dokumentacji wewnątrz Xcode, ale skopiuję go wkleić z dokumentacji UIView. Patrz wyżej: –

+6

Naprawdę nie rozumiem uzasadnienia stojącego za wdrożeniem tego przez Apple. Jaki jest sens w dopasowywaniu boków w oparciu o urządzenie, ale górny i dolny pozostają takie same, gdy zazwyczaj potrzebujesz spójnej krawędzi dookoła zawartości i dlaczego domyślnie zaznaczasz wartość pola wyboru "ograniczenia do marginesów", gdy dodajesz ograniczenia, gdy jest tak bezużyteczny. –

5

Zostało to zmienione dla iOS 11. Niestandardowe marginesy wydają się działać bardzo dobrze, gdy konfiguracja docelowej instalacji jest w tej wersji systemu iOS. Pewnego dnia będziemy się śmiać z tego, czego doświadczyliśmy wcześniej.

Jeśli chcesz ustawić wartości niższe niż minimum systemowe (które może się różnić w zależności od urządzenia) - musisz także ustawić wartość viewRespectsSystemMinimumLayoutMargins dla wartości false (domyślnie jest to prawda).

W przypadku kierowania na numer iOS 10 i niżej nie masz szczęścia, odpowiedź @Reverend jest poprawna - brak dostosowań marginesu układu dla widoku głównego kontrolera viewcontroller.

+2

To jest na odwrót. Domyślna wartość to prawda. Ustaw dla parametru 'viewRespectsSystemMinimumLayoutMargins' wartość false, aby ustawić własne marginesy. – Tricky

+0

Masz rację. Edytowałem odpowiedź. Dzięki! –

+0

'viewRespectsSystemMinimumLayoutMargins' wydaje się działać dla' UIViewController' ale nie mogę uzyskać go do pracy z 'UITableViewController'. Mogę ustawić marginesy widoku tabeli na wyższą wartość niż wartość domyślna (na przykład 64), ale nie mogę ustawić ich niższych wartości, nawet jeśli parametr 'viewRespectsSystemMinimumLayoutMargins' ma wartość" false ". Czy ktoś inny widzi to zachowanie? Wygląda jak błąd. –

Powiązane problemy