Mam jakiś dziwny błąd i nie mogę znaleźć rozwiązania.
Mam UITableView za pomocą automatycznego układu. (Przyciągnij do rodzica ze wszystkich czterech stron). Jeśli obracam urządzenie, jest renderowane poprawnie, ale jeśli spróbuję go przewinąć, przewijaj się po lewej stronie ekranu.
Czerwony kwadrat to obszar przewijania.
Kolejny problem, który zakładam, jest związany z tym, gdy próbuję dodać UIView jako subView do UITableView.
jeśli dodam:
CGRect frame = CGRectMake(0, 200, self.table.frame.size.width, 5);
UIView * mainView = [[UIView alloc]initWithFrame:frame];
mainView.backgroundColor = [UIColor redColor];
[self.table addSubview:mainView];
jest w porządku, ale jeśli lubię:
UIView * mainView = [[UIView alloc]init];
mainView.backgroundColor = [UIColor redColor];
mainView.translatesAutoresizingMaskIntoConstraints = NO;
[self.table addSubview:mainView];
[self.table addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(200)-[mainView(20)]" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(_table, mainView)]];
[self.table addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[mainView]|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(_table, mainView)]];
na błąd:
*** Assertion failure in -[UITableView layoutSublayersOfLayer:], /SourceCache/UIKit/UIKit-2903.23/UIView.m:8540
Odpowiedzi:
2 dla odpowiedzi № 1Dla opcji Autolayout włączone - (Nie ustawiaj żadnych ramek - da to dziwne zachowanie)
Ograniczenia dotyczące automatycznego usuwania powinny być następujące:
Automatyczna linia jest włączona
jeśli wyłączysz automatyczną wysyłkę, nie musisz wprowadzać żadnych zmian do historii lub kodu
1 dla odpowiedzi nr 2
Próbuję ustawić losowy estreRowHeight i wydaje się, że naprawił błąd. Prawdopodobnie będzie to błąd firmy Apple. Wersja Swift:
class MyTableView: UITableView {
override func layoutSubviews() {
self.estimatedRowHeight = 120
super.layoutSubviews()
}
}
0 dla odpowiedzi № 3
Tutaj użyj
CGRect frame = CGRectMake(0, 200, self.table.bounds.size.width, 5);
zamiast
CGRect frame = CGRectMake(0, 200, self.table.frame.size.width, 5);
0 dla odpowiedzi nr 4
Wygląda na to, że zmiany orientacjisuperview nie jest przekazywany do twojego dziecka (tableView). Spróbuj umieścić następujące elementy w willAnimateRotationToInterfaceOrientation: (UIInterfaceOrientation) toInterf czas trwania aceOrientation: (NSTimeInterval) czas trwania
self.tableView.frame = self.view.bounds;
Miałem podobny problem z UITableVieww widoku kontenera, który nie był właściwie przewijany podczas obracania do pionu do krajobrazu. Przewijany był tylko mały kawałek stołu. Potem wszystko działa dobrze.