1

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 を使用しており、いくつかのデリゲート メソッドを使用してセルのサイズなどを設定しています。

4

1 に答える 1

3

UICollectionVieworUICollectionViewControllerはまだ使用していませんが、 UITableViewandは使用しています。UITableViewController私の一般的な経験則は、UITableViewController複雑なことをしたい場合は決して使用しないことです。私はそれUICollectionViewControllerが似ていると思います: 実際にはあまり面倒を省かない、かなり脆弱で制限されたView Controllerです。

したがって、私があなたの立場にあった場合、サブクラス化してView ControllerにUIViewController含めるだけです。UICollectionViewビュー階層は次のように単純になります。

Root UIView
    UISearchBar
    UICollectionView
于 2013-03-24T15:02:50.577 に答える