A UIViewController 维护对 UICollectionView 的引用。控制器应使用 UICollectionViewDelegateFlowLayout 修改内置流布局。
将视图的数据源设置为 self 非常容易:
MyViewController.m
- (void)viewDidLoad
{
self.collectionView.dataSource = self;
}
但是,如何将控制器设置为视图的委托流布局?
- (void)viewDidLoad
{
self.collectionView.dataSource= self;
// self.collectionView.??? = self;
}
我试过:
- (void)viewDidLoad
{
self.collectionView.dataSource= self;
self.collectionView.collectionViewLayout = self;
}
但是我收到错误:"分配的指针类型不兼容..."。
集合头文件如下所示:
MyViewController.h
@interface MyViewController : UIViewController <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>
只是self.collectionView.delegate = self;
.请注意,UICollectionViewDelegateFlowLayout
继承自 UICollectionViewDelegate
。
我承认一开始这让我措手不及。
哦,这只有在实际设置为您的流布局时self.collectionView.collectionViewLayout
才有效。(或设置initWithFrame:collectionViewLayout:
)
根据前面的回答只是使用示例。真的不清楚,但我可以展示它是如何工作的:
@interface PrettyViewController()<UICollectionViewDelegateFlowLayout, UICollectionViewDataSource>
//some code
@end
@implementation PrettyViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.collectionView.delegate = self;//bingo! right here
}
#pragma mark - UICollectionViewDelegateFlowLayout
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section {
return CGSizeMake([[UIScreen mainScreen] bounds].size.width, 20.0);
}
@end
我的两分钱 macOS 莫哈韦 - 斯威夫特
(我在这里寻找NSCollectionView
...我知道问题是关于UICollectionView
的
上述所有内容(指定委托也意味着单元格大小)对于macOS也是正确的。
注意:如果您编写:
class MyViewController:
NSCollectionViewDelegate,
NSCollectionViewDataSource,
**NSCollectionViewDelegateFlowLayout**
{
方法:
func collectionView(_ collectionView: NSCollectionView,
layout collectionViewLayout: NSCollectionViewLayout,
sizeForItemAt indexPath: IndexPath) -> NSSize
将被召唤。
如果删除,则不会调用委托方法。(因为类不遵守协议)。
如果你想在 swift 中使用它就用这个
UICollectionViewDelegateFlowLayout 在你的控制器委托或为此扩展你的控制器之后添加这个
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: (collectionView.frame.size.width - 10) / 2, height: (collectionView.frame.size.width - 10) / 2)
}