如果您使用带有UITableViewController的UISearchDisplayController,当用户点击搜索栏时,它会动画起来以替换导航栏。
我想在UICollectionViewController顶部使用UISearchBar时获得相同的效果。有什么想法吗?
答案 0 :(得分:2)
我必须以编程方式将searchBar添加为UICollectionReusableView的子视图,因为在分配插座时我一直遇到原型错误,所以我永远无法通过IB工作。在实现文件中添加搜索栏对我有用。
相关方法如下。
-(void)viewDidLoad
{
[super viewDidLoad];
[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:CellIdentifier];
_objectChanges = [NSMutableArray array];
_sectionChanges = [NSMutableArray array];
[self performFetch];
searchBar = [[UISearchBar alloc]
initWithFrame:CGRectMake(0.0, 50.0, self.view.bounds.size.width,
44.0)];
searchBar.placeholder = @"Search for channels";
searchBar.tintColor = [UIColor blackColor];
searchBar.delegate = self;
}
-(UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
{
SupplementaryView *header = nil;
if ([kind isEqual:UICollectionElementKindSectionHeader])
{
header = [self.collectionView dequeueReusableSupplementaryViewOfKind:kind
withReuseIdentifier:@"reuseHeader"
forIndexPath:indexPath];
[header addSubview:searchBar];
}
return header;
}
答案 1 :(得分:1)
我刚才有同样的询问,我想出了一个半生不熟但却有效的解决方案,不涉及重写UISearchDisplayController。
(结束结果:一个UITableView - 可以回答shouldReloadTableForSearchString--覆盖在UICollectionView之上,一旦你点击搜索就被解散了,你将结果放在collectionView中。如果感兴趣,请继续阅读。) p>
在IB中创建了一个我插入的UIViewController(见截图): 用于布局目的的视图 - >我首先放弃了一个UISearchBar并显示控制器。 在同一个视图中(并排)我删除了一个带有自定义UICollectionViewCell的UICollectionView。然后我放入一个UITableViewProvider(使用自定义UITableCell,但这不是必需的,你也可以忽略屏幕截图中的UITabBarItem和Nav项,这是无关紧要的)
我将UITableView的高度设置为0,并连接所有Outlets和委托,最终结果如下:当光标进入UISearchBox时,UITableView覆盖在UICollectionView的顶部,一个类型为shouldReloadTableForSearchString del被调用,结果出现在tableView中;在searchBarSearchButtonClicked上,我只需设置UICollectionView的dataSource,并在它的插座上调用reloadData,et Voila。
有人会认为Apple应该对搜索显示控制器进行基因识别;也许在未来的版本中?
(这是因为这是UISearchDisplay控制器的优化方式,IIRC实际上每个字符条目有一个UITableView堆叠在一起)
(不发布代码,因为涉及到很多; plz询问是否有任何不直接的事情)
答案 2 :(得分:0)
这里只是一个快捷的代码 - 为我工作!
func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {
let headerView = self.mainPictureCollectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: "headerView", forIndexPath: indexPath)
headerView.addSubview(searchBar)
return headerView
}