9 つのセルを含む UICollectionView があります。各セルは正方形なので、3 x 3 のグリッドに配置されます。これはうまく機能し、デバイスが回転するとperformBatchUpdates:completion:
、collectionView を呼び出してセルを新しい向きにレイアウトします。
検索バーがない場合は次のようになります。
次のように、collectionView の上に UISearchBar を追加しようとしています。
ヘッダー ビューとして追加しようとしましたが、上部に表示されるのではなく、画面全体を消費し、セルが右に押し出されます。それらを見るには、検索バーがない場合と同じように表示される場所をスクロールします。
検索バーを追加するために、2 つの方法を試しました。どちらも完全には機能せず、ひどい練習のように思えます。私が試した最初の方法は、検索バーをヘッダー ビューとして追加することです。私のメイン ビューは、UICollectionViewController のサブクラスです。設定方法は次のとおりです。
- (void) viewDidLoad
{
// Set up some other things...
//
// Register the header view class
// which installs a search bar inside
// of itself.
//
[[self collectionView] registerClass:[PDReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"header"];
}
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
{
PDReusableView *header = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"header" forIndexPath:indexPath];
[header setFrame:[[[self navigationController] navigationBar] bounds]];
return header;
}
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section
{
if (section == 0) {
return CGSizeMake(collectionView.frame.size.width, self.navigationController.navigationBar.frame.size.height);
}
return CGSizeZero;
}
PDReusableView 内に、UISearchBar をインストールします。これは私が得るものです:
したがって、検索コントローラーまたは検索バーを再利用可能なビューにまとめることができないため、このアプローチは失敗します。再利用可能なビューに入れることができない場合、UICollectionView に入れることはできません。
もう 1 つのオプションは、コレクション ビューのサイズを変更して、画面全体を占有しないようにすることです。次に問題は、ビュー階層のどこに検索バーをインストールすればよいかということです。最も単純な場所は、間違っている可能性がありますが、ビュー階層の残りの部分をセットアップするアプリ デリゲートです。検索バーをコレクションビューの上に表示するようにするには、内部にインストールすることで管理しましたapplication:didFinishLaunchingWithOptions:
。そのためのコードは次のとおりです。
UICollectionView *collectionView = [[self mainMenuViewController] collectionView];
CGRect f = [collectionView frame];
CGFloat height = [[[self navigationController] navigationBar] frame].size.height;
f.size.height -= height;
f.origin.y += height;
[collectionView setFrame:f];
// Cause the cells to be laid out per the new frame
[collectionView performBatchUpdates:nil completion:nil];
[[collectionView superview] addSubview:[self searchBar]];
[[self searchBar] setFrame:[[[self navigationController] navigationBar] bounds]];
アプリ デリゲートに検索ロジックを追加することはできますが、アプリ デリゲートでデータセット、フィルター処理された検索結果、およびその他の多くのロジックを維持することになるため、これを行うのは適切ではありません。UICollectionViewController サブクラスは、配置するのにはるかに適切な場所だと思います。
Interface Builderを使用せずにUISearchBarをUICollectionViewにインストールする方法はありますか? どのように?
編集:
私はバニラの UICollectionViewFlowLayout を使用しており、いくつかのデリゲート メソッドを使用してセルのサイズなどを設定しています。