Làm thế nào để thiết lập UICollectionViewDelegateFlowLayout?


108

Một UIViewController duy trì một tham chiếu đến một UICollectionView. Bộ điều khiển nên sửa đổi bố cục luồng tích hợp bằng UICollectionViewDelegateFlowLayout.

Thật dễ dàng để đặt nguồn dữ liệu của chế độ xem thành tự:

MyViewController.m

- (void)viewDidLoad
{
    self.collectionView.dataSource = self;
}

Nhưng làm cách nào để đặt bộ điều khiển làm bố cục luồng đại biểu của dạng xem?

- (void)viewDidLoad
{
    self.collectionView.dataSource= self;
    // self.collectionView.??? = self; 
}

Tôi đã thử:

- (void)viewDidLoad
{
    self.collectionView.dataSource= self;
    self.collectionView.collectionViewLayout = self; 
}

Nhưng tôi gặp lỗi: "Loại con trỏ không tương thích gán ...".

Tệp tiêu đề bộ sưu tập trông giống như sau:

MyViewController.h

@interface MyViewController : UIViewController <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>

Câu trả lời:


265

Chỉ là self.collectionView.delegate = self;. Lưu ý rằng UICollectionViewDelegateFlowLayoutkế thừa từ UICollectionViewDelegate.

Tôi thừa nhận lúc đầu nó đã làm tôi mất cảnh giác.

Ồ và điều này sẽ chỉ hoạt động nếu self.collectionView.collectionViewLayoutthực sự được đặt thành bố cục luồng của bạn. (hoặc đặt bằng initWithFrame:collectionViewLayout:)


1
@JohnEstropia, xin lỗi vì câu hỏi, nhưng làm thế nào để bắt đầu bố cục tùy chỉnh trong mã? Tôi thấy các ví dụ với bảng phân cảnh nhưng không phải với chính mã. Tôi nên làm gì?
gaussblurinc

3
có lẽ, self.collectionViewLayout = UICollectionViewFlowLayout(),self.collectionViewLayout = [[UICollectionViewFlowLayout alloc]init]
Daishi Nakajima

14

Theo câu trả lời trước chỉ là ví dụ về việc sử dụng. Nó thực sự không rõ ràng nhưng tôi có thể chỉ ra cách nó hoạt động:

@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

1

Hai xu của tôi cho macOS Mojave - Swift

(Tôi đã rơi xuống đây để tìm kiếm NSCollectionView... Tôi biết câu hỏi là vềUICollectionView ..)

Tất cả những gì đã nói ở trên (chỉ định đại biểu cũng ngụ ý kích thước ô) cũng đúng cho macOS.

LƯU Ý : Nếu bạn viết:

class MyViewController:
    NSCollectionViewDelegate,
    NSCollectionViewDataSource,
    **NSCollectionViewDelegateFlowLayout** 
{

phương pháp:

func collectionView(_ collectionView: NSCollectionView, 
                      layout collectionViewLayout: NSCollectionViewLayout, 
               sizeForItemAt indexPath: IndexPath) -> NSSize

sẽ được gọi.

Nếu bị loại bỏ, sẽ không có phương thức đại biểu nào được gọi. (vì lớp không tuân theo giao thức).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.