Dynamiczna wysokość komórki UITableView z funkcją AutoLayout z dynamicznymi etykietami typów
Zaimplementowałem moje komórki tableview za pomocą funkcji AutoLayout, aby wyświetlić obraz i 2 etykiety, używając dynamicznego typu dla adaptacyjnego rozmiaru czcionki.
Zaimplementowałem estimateHeightForRowAtIndexPath, co ma doskonały sens i jest łatwe w użyciu.
Nie używam budowniczego interfejsu dla komórek. Zamiast tego używam masonerii, co nie powinno mieć znaczenia.
Obecnie walczę z obliczeniem rzeczywistej wysokości komórki. Ręczne obliczanie to ból i trudny do utrzymania przy aktualizacji kodu automatycznego układu.
Znalazłem odpowiedź StackOverFlow:Korzystanie z Auto Layout w UITableView dla dynamicznych układów komórek i zmiennych wysokości rzędów To rozwiązanie powinno również zadbać o różne rozmiary czcionek, ale nie działa dla mnie.
Kiedy mam taki system AutoLayout: UILabel do góry contentView z dopełnieniem, inny UILabel do dołu contentView z dopełnieniem, powinien automatycznie obliczyć wysokość komórki.
Ale zamiast tego powoduje następujący konflikt AutoLayout:
UIView property translatesAutoresizingMaskIntoConstraints)
(
"<MASLayoutConstraint:0xc506be0 UIImageView:0xc5070a0.height == 150>",
"<MASLayoutConstraint:0xc506d90 UIImageView:0xc5070a0.top == UITableViewCellContentView:0xc5076e0.top + 10>",
"<MASLayoutConstraint:0xc506990 UILabel:0xc507450.top == UIImageView:0xc5070a0.bottom + 10>",
"<MASLayoutConstraint:0xc506630 UILabel:0xc507260.top == UILabel:0xc507450.bottom>",
"<MASLayoutConstraint:0xc506530 UILabel:0xc507260.bottom == UITableViewCellContentView:0xc5076e0.bottom>",
"<NSAutoresizingMaskLayoutConstraint:0xc3d05a0 UITableViewCellContentView:0xc5076e0.height == 44>"
)
Używam następującego kodu AutoLayout:
[self.subtitleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(self.titleLabel.mas_bottom);
make.right.equalTo(self.contentView.mas_right).with.offset(-GCBaconCellRowPadding);
make.left.equalTo(self.contentView.mas_left).with.offset(GCBaconCellRowPadding);
make.bottom.equalTo(self.contentView.mas_bottom);
}];
Ostatnia linia powinna wskazywać, że wysokość komórki się rozszerza.
Patrząc na wynik konfliktu AutoLayout, wygląda na to, że chce on ustawić wysokość automatycznie na 44.0, co jest wartością domyślną.
Edytować: Ustawianie contentView's tłumaczyAutoresizingMaskIntoConstraints na NO
self.contentView.translatesAutoresizingMaskIntoConstraints = NO;
podczas tworzenia komórki naprawia kolizję, ale uzyskuje zerową wysokość wiersza.