сделать панель поиска, чтобы остаться на вершине - PullRequest
1 голос
/ 12 октября 2010

Можно ли изменить тип экрана приложения контактов iphone, чтобы панель поиска всегда оставалась сверху?если да как?

Ответы [ 2 ]

2 голосов
/ 13 октября 2010

Я нашел способ сделать это.

вот оно

  1. перетащить представление таблицы в отдельное представление
  2. сначала разместите строку поиска, а затем табличное представление в новом отдельном представлении
  3. создайте iboutlet для представления таблицы и подключите его.
  4. внести соответствующие изменения в делегат табличного представления.
  5. Измените измерения uitableview, добавленного к новому табличному виду.
0 голосов
/ 05 января 2015

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

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

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

@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);
}

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

- (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];
}
...