วิธีการตั้งค่า UICollectionViewDelegateFlowLayout?


109

UIViewController รักษาการอ้างอิงถึง UICollectionView คอนโทรลเลอร์ควรแก้ไขเค้าโครงโฟลว์ที่มีอยู่แล้วภายในโดยใช้ UICollectionViewDelegateFlowLayout

การตั้งค่าแหล่งข้อมูลของมุมมองเป็นเรื่องง่าย:

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>

คำตอบ:


266

เพียงself.collectionView.delegate = self;. โปรดทราบว่าสืบทอดมาจากUICollectionViewDelegateFlowLayoutUICollectionViewDelegate

ฉันยอมรับว่ามันทำให้ฉันไม่ทันระวังในตอนแรก

โอ้และสิ่งนี้จะใช้ได้ก็ต่อเมื่อself.collectionView.collectionViewLayoutตั้งค่าเป็นเค้าโครงโฟลว์ของคุณจริงๆ (หรือตั้งค่าด้วยinitWithFrame:collectionViewLayout:)


1
@JohnEstropia ขออภัยสำหรับคำถาม แต่จะเริ่มเลย์เอาต์แบบกำหนดเองในโค้ดได้อย่างไร ฉันเห็นตัวอย่างที่มีสตอรีบอร์ด แต่ไม่เห็นด้วยโค้ด ฉันควรทำอย่างไรดี?
gaussblurinc

3
อาจself.collectionViewLayout = UICollectionViewFlowLayout(),self.collectionViewLayout = [[UICollectionViewFlowLayout alloc]init]
Daishi นากาจิมา

14

ตามคำตอบก่อนหน้านี้เป็นเพียงตัวอย่างการใช้งาน มันไม่ชัดเจน แต่ฉันสามารถแสดงให้เห็นว่ามันทำงานอย่างไร:

@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

สองเซ็นต์ของฉันสำหรับmacOS Mojave - Swift

(ฉันตกหลุมค้นหาNSCollectionView... ฉันรู้ว่ามีคำถามเกี่ยวกับUICollectionView.. )

ทั้งหมดที่กล่าวมาข้างต้น (การระบุตัวแทนหมายถึงขนาดเซลล์ด้วย) ถูกต้องสำหรับ macOS ด้วย

หมายเหตุ : ถ้าคุณเขียน:

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

วิธีการ:

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

จะถูกเรียก

หากนำออกจะไม่มีการเรียกเมธอดผู้รับมอบสิทธิ์ (เนื่องจากคลาสไม่ปฏิบัติตามโปรโตคอล)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.