2014-11-29 13 views
5

Próbuję użyć UITableViewAutomaticDimension, ale mam problem z uzyskaniem komórki o pełnej szerokości i prawidłowej wysokości bez powodowania problemów z NSLayoutAutomaticSizeConstraint.... Jeśli wyłączę automatyczne ograniczenia rozmiaru w komórce, nie jest to pełna szerokość.UITableViewAutomaticDimension łamanie ograniczeń?

enter image description here

mam dwa przyciski z ograniczeniami poziomych i pionowych do zawartości widoku. Mają pionowe odstępy między sobą, a każdy przycisk ma ograniczenie wysokości.

Jeśli wyłączysz AutoResizingMask, otrzymam komórkę o niepełnej szerokości. Jeśli zostanę włączony, otrzymam naruszenie ograniczeń układu, ale rzeczy będą renderowane poprawnie.

W jaki sposób uzyskać zachowanie, którego szukam?

translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x7f856b169650 V:[UIButton:0x7f856b16a510'+(null)'(50)]>", 
    "<NSLayoutConstraint:0x7f856b173dd0 UIButton:0x7f856b16a510'+(null)'.top == UITableViewCellContentView:0x7f856b16bfa0.topMargin>", 
    "<NSLayoutConstraint:0x7f856b173e70 UITableViewCellContentView:0x7f856b16bfa0.bottomMargin == UITextField:0x7f856b16c4f0.bottom>", 
    "<NSLayoutConstraint:0x7f856b174520 V:[UIButton:0x7f856b16a510'+(null)']-(8)-[UITextField:0x7f856b16c4f0]>", 
    "<NSLayoutConstraint:0x7f856b182a10 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7f856b16bfa0(66)]>" 
) 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7f856b169650 V:[UIButton:0x7f856b16a510'+(null)'(50)]> 

To faktycznie wygląda szerokość jest ustawiona przez

- (CGSize)intrinsicContentSize { 
    return CGSizeMake(320, 66); 
} 

Jeśli nie ustawić wewnętrzną wielkość treści, nie dostanę żadnej szerokość lub wysokość.

+0

1) Czy tworząc swoje ograniczenia i widoki w kodzie? 2) Czy w nawigatorze widoku pojawia się żółty lub czerwony błąd? 3) co jeszcze masz w widoku? – Spectravideo328

+0

Jakie są naruszenia ograniczeń układu? – Lefteris

+0

@ Spectravideo328 W IB nie występują błędy żółte lub czerwone, a wszystkie wiązania są w IB. –

Odpowiedz

2

edit: Jego zdecydowanie dwa ograniczenia wysokości. Spróbuj usunąć jeden lub obniżyć priorytet.

+0

Ustawiam oba ograniczenia wysokości na 999 zamiast na 1000. Brak wyjątków autolayout. Nie rozumiem, ale działa to dla mnie. –

+0

Przy obecnych ograniczeniach w zasadzie masz komórkę o stałej wysokości. Pomyśl o tym w ten sposób, jeśli trzy ograniczenia wertykalne mają wartość 5, a wysokości guzików mają wartość 10, wysokość jest ustalona na 35 (5 + 10 + 5 +10 +5). –

+0

Jasne, i to jest mój zamiar. Ale mam kilka komórek o różnych wysokościach i bez automatycznego wymiaru oznaczałoby to cały szereg kodu. Dolna przekładka może być "co najmniej", ale to jedyny prawdziwy pokój, który chcę. –

1

AutoresizingMask on = zezwól rodzicom tego widoku na ustawienie odpowiednich masek.

AutoresizingMask off = Nie zezwalaj rodzicom tego widoku na ustawianie odpowiednich masek. Chcę to zrobić na własną rękę.

Jeśli tworzysz widoki w IB, ich automatyczne maskowanie jest domyślnie ustawione na Nie.

Jeśli tworzysz widoki w kodzie, ich automatyczne maskowanie jest domyślnie ustawione na Tak.

Fakt, że po wyłączeniu opcji AutoresizingMask uzyskujesz komórkę o pełnej szerokości (lub naprawdę żadnej zmianie) oznacza, że ​​rodzic (w hierarchii widoków) komórki lub tabeli przejmuje kontrolę i ustawia wiązania (co nie jest tym, czego chcesz).

Teraz powód myślę, że dostajesz to nie pełna komórkę szerokość z powodu uciążliwego domyślnie w IB podczas przeciągania między widokiem elementów do ustawiania ograniczeń, gdzie zamiast związania ograniczeń na górze, na dole, etc ..; IB wiąże je z marginesem (różne).

Więc trzeba wybrać swoje ograniczenia z „zarysu dokumentu”:

Document outline

A następnie wybrać jeden po drugim swoimi ograniczeniami, które wiążą się do granicy:

Constraint closed

Upewnij się, że "Względny margines" nie jest zaznaczony.

Constraint open

Jeśli użyć zakładki ograniczeń podsumowanie w prawym dolnym rogu IB (drugi od lewej), możesz odznaczyć „Wiązanie na marginesie” przy tworzeniu ograniczeń:

Constraints summary

Constraints optn

+0

@StefanKendall tak jak wyżej, czy ograniczenia na górze, na prawo i na lewo są ustawione na ContentView, a nie na marginesie contentView? – Spectravideo328

1

Miałem podobny problem z tym:

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 

on rzucił mi dziennik o „stanie zaspokoić ograniczeń”, ale nie było żadnych ograniczeń w błąd tak Dodałem estimatedHeightForRowAtIndexPath:

func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 

i to ustalone

Powiązane problemy