我有一个UICollectionView,里面有九个单元格。每个单元格都是正方形,因此它们以3乘3的网格布局。这很好用,当设备旋转时,我调用performBatchUpdates:completion:
来强制collectionView为新方向布局单元格。
以下是没有搜索栏的情况:
我现在正在尝试在collectionView的顶部添加一个UISearchBar,如下所示:
我已经尝试将其添加为标题视图,但它不会显示在顶部,而是消耗整个屏幕,并且单元格被推向右侧。要查看它们,请滚动显示,而不显示搜索栏。
要添加搜索栏,我尝试了两种方法。两者都没有完全奏效,而且似乎是一种糟糕的做法。我试过的第一种方法是将搜索栏添加为标题视图。我的主视图是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。
我的另一个选择是调整集合视图的大小,因此它不占用整个屏幕。那么问题就是,我在视图层次结构中的哪个位置安装搜索栏?最简单的地方,虽然可能不正确,但是是app委托,我在其中设置了视图层次结构的其余部分。我设法让搜索栏显示在集合视图的上方,方法是在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的情况下在UICollectionView中安装UISearchBar?怎么样?
修改
我正在使用vanilla UICollectionViewFlowLayout并使用一些委托方法来设置单元格的大小等。
答案 0 :(得分:3)
我还没有使用UICollectionView
或UICollectionViewController
,但我使用了UITableView
和UITableViewController
,我的一般经验法则是:从不使用{{1如果你想做任何复杂的事情。我怀疑UITableViewController
是相似的:一个相当脆弱,有限的视图控制器,实际上并没有为你节省太多麻烦。
因此,如果我在你的位置,我会看到只是继承UICollectionViewController
并在我的视图控制器中包含UIViewController
。您的视图层次结构可能非常简单:
UICollectionView