UISearchDisplayController を UITableViewController と共に使用する場合、ユーザーが検索バーをタップするとアニメーション化されてナビゲーション バーが置き換えられます。
UICollectionViewController の上部で UISearchBar を使用するときに、同じ効果を得たいと思います。何か案は?
UISearchDisplayController を UITableViewController と共に使用する場合、ユーザーが検索バーをタップするとアニメーション化されてナビゲーション バーが置き換えられます。
UICollectionViewController の上部で UISearchBar を使用するときに、同じ効果を得たいと思います。何か案は?
UICollectionReusableViewのサブビューとしてプログラムでsearchBarを追加する必要がありましたが、アウトレットを割り当てるときにプロトタイプエラーが発生し続けたため、IBを介してsearchBarを機能させることはできませんでした。実装ファイルに検索バーを追加すると、うまくいきました。
関連する方法は次のとおりです。
-(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;
}
私は同じ問い合わせをしたばかりで、UISearchDisplayController の書き換えを必要としない、中途半端ではあるが実用的なソリューションを思いつきました。
(最終結果: UITableView -- shouldReloadTableForSearchString に応答するもの -- UICollectionView の上にオーバーレイされ、検索をクリックすると閉じられ、collectionView に結果が表示されます。興味がある場合は読み進めてください)
IB で、挿入した UIViewController を作成しました (スクリーンショットを参照): レイアウト用のビュー --> 最初に UISearchBar とディスプレイ コントローラーをドロップしました。同じビュー (並べて表示) に、カスタム UICollectionViewCell を持つ UICollectionView をドロップしました。次に、UITableViewProvider をドロップしました (カスタム UITableCell を使用しますが、これは必須ではありません。スクリーンショットの UITabBarItem と Nav アイテムを無視することもできます。これは重要ではありません)。
UITableView の高さを 0 に設定し、すべてのアウトレットとデリゲートを配線しました。最終的な結果は次のようになります。カーソルが UISearchBox に入ると、UICollectionView の上に UITableView オーバーレイが表示されます。結果は tableView に表示されます。searchBarSearchButtonClicked では、UICollectionView の dataSource を設定し、そのアウトレットで reloadData を呼び出すだけです。
Apple は検索表示コントローラーをジェネリック化すべきだと考える人もいるでしょう。おそらく将来のリリースで?
(これは、UISearchDisplay コントローラーが最適化される方法であるため機能します。IIRC には、文字エントリごとに 1 つの UITableView が実際に積み重ねられています)
(かなり複雑なため、コードを掲載していません。簡単でない点がある場合はお問い合わせください)
ここに迅速なコードがあります-私にとってはうまくいきました!
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
}