8

UICollectionView에 서브 뷰로 추가되고 UISearchDisplayController에 첨부됩니다. UICearchDisplayController를 사용할 때 UICollectionView의 UISearchBar이 사라집니다.

내가 viewDidLoad에 그것을 설정 :

self.searchController = [[UISearchDisplayController alloc] initWithSearchBar:self.searchBar 
                  contentsController:self]; 
self.searchController.delegate = self; 
self.searchController.searchResultsDataSource = self; 
self.searchController.searchResultsDelegate = self; 

[self.collectionView addSubview:self.searchBar]; 

내가 다음 팝업 네비게이션 컨트롤러에 다른 뷰 컨트롤러를 누르면, 검색 표시 줄이 사라집니다. 검색 모음을 숨길 수 있도록 컬렉션보기가 충분히 아래로 스크롤 된 경우에만 발생합니다. 또한 검색 창이 사라지더라도 공백이있는 곳을 두드리면 연결된 검색 창 컨트롤러가 활성화됩니다.

이는 iOS 7에서만 발생하며 검색 디스플레이 컨트롤러를 제거하면 검색 창이 사라지지 않습니다.

한 가지 더 말할 가치가 있습니다. 검색 막대가 사라지면 다른보기 컨트롤러를 누른 다음 팝업하면 막대가 다시 표시됩니다.

분명히이 버그는 iOS 7에서 UISearchDisplayController의 버그입니다. 따라서 해결 방법에 대한 아이디어가 있으십니까?

+0

당신이 해결책을 찾았나요? 나는 같은 문제를 겪고있다. UISearchDisplayController.uisearchbar를 collectionView 헤더에 추가했습니다. 사용자가 다른보기로 밀고 다시 팝업하면. uisearchbar가 사라집니다. 그러나 사용자가 빈 공간을 탭하면 여전히 활성화 될 수 있습니다. –

+0

운동을 찾을 수 없어서'UISearchDisplayController'를 혼자서 다시 작성했습니다. –

+0

uisearchbar에서 활성 상태로 애니메이션을 만들고 uitableview를 직접 추가한다는 의미입니까? 실제로 나는 "활성"애니메이션이 필요합니다. 유사한 효과를 생성하는 쉬운 방법이 있는지 확실하지 않습니다. –

답변

4

나는 UISearchDisplayController을 독자적으로 구현했습니다. 여기 내 코드가있다.

ZBNSearchDisplayController.h

@protocol ZBNSearchDisplayDelegate; 

@interface ZBNSearchDisplayController : NSObject<UISearchBarDelegate> 

- (id)initWithSearchBar:(UISearchBar *)searchBar contentsController:(UIViewController *)viewController; 
- (void)setActive:(BOOL)visible animated:(BOOL)animated; 

@property(nonatomic,assign) id<ZBNSearchDisplayDelegate> delegate; 
@property(nonatomic, getter = isActive) BOOL active; 
@property(nonatomic, readonly) UISearchBar *searchBar; 
@property(nonatomic, readonly) UIViewController *searchContentsController; 
@property(nonatomic, readonly) UITableView *searchResultsTableView; 
@property(nonatomic, assign) id<UITableViewDataSource> searchResultsDataSource; 
@property(nonatomic, assign) id<UITableViewDelegate> searchResultsDelegate; 

@end 

@protocol ZBNSearchDisplayDelegate <NSObject> 

@optional 

- (void)searchDisplayControllerWillBeginSearch:(ZBNSearchDisplayController *)controller; 
- (void)searchDisplayControllerDidBeginSearch:(ZBNSearchDisplayController *)controller; 
- (void)searchDisplayControllerWillEndSearch:(ZBNSearchDisplayController *)controller; 
- (void)searchDisplayControllerDidEndSearch:(ZBNSearchDisplayController *)controller; 
- (void)textDidChange:(NSString *)searchText; 
- (void)searchBar:(UISearchBar *)searchBar selectedScopeButtonIndexDidChange:(NSInteger)selectedScope; 

@end 

ZBNSearchDisplayController.m

#import "ZBNSearchDisplayController.h" 

@implementation ZBNSearchDisplayController 

- (id)initWithSearchBar:(UISearchBar *)searchBar contentsController:(UIViewController *)viewController { 
    self = [super init]; 

    if (self) { 
     _searchBar = searchBar; 
     _searchBar.delegate = self; 
     _searchContentsController = viewController; 

     CGFloat y = 64.0f; 
     CGFloat height = _searchContentsController.view.frame.size.height - y; 

     _searchResultsTableView = [[UITableView alloc] initWithFrame:CGRectMake(0.0f, y, _searchContentsController.view.frame.size.width, height)]; 
     _searchResultsTableView.scrollsToTop = NO; 
    } 

    return self; 
} 

- (void)setSearchResultsDataSource:(id<UITableViewDataSource>)searchResultsDataSource { 
    _searchResultsTableView.dataSource = searchResultsDataSource; 
} 

- (void)setSearchResultsDelegate:(id<UITableViewDelegate>)searchResultsDelegate { 
    _searchResultsTableView.delegate = searchResultsDelegate; 
} 

- (void)setActive:(BOOL)visible animated:(BOOL)animated { 
    if (!visible) { 
     [_searchBar resignFirstResponder]; 
     _searchBar.text = nil; 
     _searchBar.showsCancelButton = NO; 
    } 

    if (visible && [self.delegate respondsToSelector:@selector(searchDisplayControllerWillBeginSearch:)]) { 
     [self.delegate searchDisplayControllerWillBeginSearch:self]; 
    } else if (!visible && [self.delegate respondsToSelector:@selector(searchDisplayControllerWillEndSearch:)]) { 
     [self.delegate searchDisplayControllerWillEndSearch:self]; 
    } 

    [_searchContentsController.navigationController setNavigationBarHidden:visible animated:YES]; 

    float alpha = 0; 

    if (visible) { 
     [_searchContentsController.view addSubview:_searchResultsTableView]; 
     alpha = 1.0; 
    } 

    if ([_searchContentsController.view respondsToSelector:@selector(scrollEnabled)]) { 
     ((UIScrollView *)_searchContentsController.view).scrollEnabled = !visible; 
    } 

    if (animated) { 
     [UIView animateWithDuration:0.2 animations:^{ 
      _searchResultsTableView.alpha = alpha; 
     } completion:^(BOOL finished) { 
      self.active = visible; 
     }]; 
    } else { 
     _searchResultsTableView.alpha = alpha; 
    } 
} 

#pragma mark - UISearchBarDelegate 

- (void)searchBar:(UISearchBar *)searchBar selectedScopeButtonIndexDidChange:(NSInteger)selectedScope { 
    if ([self.delegate respondsToSelector:@selector(searchBar:selectedScopeButtonIndexDidChange:)]) { 
     [self.delegate searchBar:searchBar selectedScopeButtonIndexDidChange:selectedScope]; 
    } 
} 

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { 
    if ([self.delegate respondsToSelector:@selector(textDidChange:)]) { 
     [self.delegate textDidChange:searchText]; 
    } 
} 

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar { 
    [searchBar setShowsCancelButton:YES animated:YES]; 
    [self setActive:YES animated:YES]; 
    [_searchResultsTableView reloadData]; 
} 

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar { 
    [_searchResultsTableView reloadData]; 
} 

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar { 
    [self setActive:NO animated:YES]; 
    [self.searchResultsTableView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO]; 
} 

@end