2012-06-27 9 views

ответ

7

Я бы не рекомендовал UITableViewController для этого тогда, в UIViewController с UITableVIew и UISearchBar на нем, а не на заголовок будет делать эту работу. В более личном мнении, я бы не рекомендовал UITableViewController для чего-либо, я нахожу его слишком строгим для того, что он действительно предлагает. Если по какой-то причине я использую UITableViewController, и клиент просит меня добавить новый элемент на экран, я в основном завинчен.

+0

Я согласен с тобой, +1. –

+0

Я отредактировал вопрос, удерживая +1. : P – Peres

+2

Я бы рекомендовал 'UITableViewController', если у вас есть текстовые поля. Когда клавиатура появляется, таблица сдвигается сама по себе. С другой стороны, вам нужно реализовать свое «я». Приветствия. –

0

Я знаю, что это старый вопрос, но я нашел решение для этого, которое работает с классическим UITableViewController и UTSearchDisplayController.

Я создал контейнерный вид для поискаBar 1, затем поместил в него панель поиска. Контейнер не должен зажиматься до границ. После этого вы можете изменить положение панели поиска относительно контейнера. Одна из проблем заключается в том, что таким образом поисковая панель не обрабатывает взаимодействия пользователей. Поэтому нам нужно использовать наш собственный контейнер, который получает события ниже своего реального кадра.

Наш класс контейнер:

@interface _SearchContainerView : UIView 
@end 

@implementation _SearchContainerView 
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { 
    if (self.subviews.count > 0) { 
     UISearchBar *searchBar = (UISearchBar *) self.subviews[0]; 
     CGRect f = searchBar.frame; 
     f = CGRectMake(0, 0, f.size.width, f.origin.y + f.size.height); 
     if (CGRectContainsPoint(f, point)) return YES; 
    } 
    return [super pointInside:point withEvent:event]; 
} 
@end 

Если вы создаете SearchBar программно вы можете установить это с следующий как код:

- (void)setSearchEnabled:(BOOL)searchEnabled { 
    if (searchBar == nil && searchEnabled) { 
     searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, self.tableView.bounds.size.width, 44)]; 
     searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar 
                   contentsController:self]; 
     searchBar.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin 
            | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth; 
     searchDisplayController.delegate = self; 
     searchDisplayController.searchResultsDataSource = self; 

     searchContainer = [[_SearchContainerView alloc] initWithFrame:searchBar.frame]; 
     [container addSubview:searchBar]; 
     container.clipsToBounds = NO; 

     self.tableView.tableHeaderView = container; 

    } else { 
     [searchBar removeFromSuperview]; 
     self.tableView.tableHeaderView = nil; 
     searchBar = nil; 
     searchDisplayController = nil; 
     searchContainer = nil; 
    } 
} 

Затем вы можете изменить позицию, основанную на Tableview-х положение прокрутки:

-(void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    if (searchBar == nil || searchDisplayController.isActive) return; 
    CGRect b = self.tableView.bounds; 
    // Position the searchbar to the top of the tableview 
    searchBar.frame = CGRectMake(0, b.origin.y, b.size.width, 44); 
} 

И последняя часть предназначена для восстановления e все после поиска:

- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller { 
    // Restore header alpha 
    searchContainer.alpha = 1.0; 
    // Place the searchbar back to the tableview 
    [searchBar removeFromSuperview]; 
    [searchContainer addSubview:searchBar]; 
    // Refresh position and redraw 
    CGPoint co = self.tableView.contentOffset; 
    [self.tableView setContentOffset:CGPointZero animated:NO]; 
    [self.tableView setContentOffset:co animated:NO]; 
} 
Смежные вопросы