Câu hỏi Cách đặt UICollectionViewDelegateFlowLayout?


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 cách sử dụ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à bố cục luồng đại biểu của chế độ 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 nhận được lỗi: "Các kiểu 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>

76
2017-10-17 00:08


gốc




Các câu trả lời:


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

Tôi thừa nhận nó có thể khiến bạn mất cảnh giác lúc đầu.

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


192
2017-10-17 00:38



@ JohnEstropia, xin lỗi cho câu hỏi, nhưng làm thế nào để init bố trí 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
có lẽ, self.collectionViewLayout = UICollectionViewFlowLayout(), self.collectionViewLayout = [[UICollectionViewFlowLayout alloc]init] - Daishi Nakajima


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

@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

9
2018-04-06 13:06