2014-01-21 9 views
5

UITableView meldet einen größeren contentSize als erwartet, wenn Sie einen UISearchBar verwenden. Bei Null-Zellen wäre die erwartete Inhaltshöhe Null. Stattdessen gibt den folgenden Code 612 in iPhone 4-Zoll-Laufe IOS 7.UITableView contentSize falsch bei Verwendung von UISearchBar

@implementation HPViewController { 
    UITableView *_tableView; 
    UISearchBar *_searchBar; 
    UISearchDisplayController *_searchController; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    _tableView = [[UITableView alloc] initWithFrame:self.view.bounds]; 
    _tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
    [self.view addSubview:_tableView]; 

    _searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)]; 

    _searchController = [[UISearchDisplayController alloc] initWithSearchBar:_searchBar contentsController:self]; 
    _searchController.delegate = self; 
    _searchController.searchResultsDataSource = self; 
    _tableView.tableHeaderView = _searchBar; 
} 

- (void)viewDidLayoutSubviews 
{ 
    CGSize contentSize = _tableView.contentSize; 
    NSLog(@"%f", contentSize.height); // 612.000000 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 0; } 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { return nil; }; 

@end 

die Linie kommentierte, dass die Header Ansicht stellt den Code macht Ausgang 0 ist, wie erwartet.

Wenn ich eine leere UIView als Header zuweisen, wird die contentSize korrekt sein und die Höhe der Kopfzeile entsprechen. Das Problem tritt nur mit UISearchBar auf.

Gibt es einen Weg um dies zu umgehen? Mache ich etwas falsch?

+1

Ich habe das gleiche Problem heute mit iOS 11.2. Mit 1 Kopfzeile und 1 Zelle in der Tabelle kann ich fast alle Inhalte vom Bildschirm scrollen. Die contentSize hat jedoch die Höhe, die ich unter iOS 10.3.1 erwarte. –

Antwort

2

Platzieren Sie die UISearchBar in einem Container UIView meist behebt das Problem.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    _tableView = [[UITableView alloc] initWithFrame:self.view.bounds]; 
    _tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
    [self.view addSubview:_tableView]; 

    UIView *searchBarContainer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 44)]; 
    _searchBar = [[UISearchBar alloc] initWithFrame:searchBarContainer.bounds]; 
    [searchBarContainer addSubview:_searchBar]; 

    _searchController = [[UISearchDisplayController alloc] initWithSearchBar:_searchBar contentsController:self]; 
    _searchController.delegate = self; 
    _searchController.searchResultsDataSource = self; 
    _tableView.tableHeaderView = searchBarContainer; 
} 

Leider sind die UISearchBar Störungen in einigen Szenarien, die ich noch nicht isolieren konnten. Ich entschied mich, die contentSize manuell zu berechnen, indem ich die Höhe aller Zellen hinzufüge.

+0

Vielen Dank für den Tipp zum Hinzufügen zu einer Unteransicht. Zumindest für mich, das hat sich selbstständig gemacht. –

+0

Es gibt eine Funktion, wenn die Suchleiste automatisch unter der Navigationsleiste ausgeblendet wird. Leider verschwindet es von diesem Sichtcontainer ... –

0

Dieses Delegatmethode

-(UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section 
{ 
    return [[UIView alloc] initWithFrame:CGRectZero]; 
} 

Vielleicht für Fußzeile Ihrer Ansicht nach ist groing, weil es keine Zellen zu zeigen.

+0

Das würde nicht heißen. In meinem Beispielcode sind keine Abschnitte enthalten. Der Header ist der Header der Tabellenansicht, nicht eine Sektionskopfzeile. – hpique

+0

Ja, Sie haben Recht. Also habe ich keine ideia. Es ist sehr schlecht. –

Verwandte Themen