Tôi muốn chỉ ra rằng, như bạn đã đề cập, RayWenderlich PinInterest Layout chính xác là hướng dẫn sẽ giúp bạn đạt được bố cục này.
Để trả lời câu hỏi của bạn - liên quan đến hướng dẫn:
Trong bước 2, làm thế nào và khi nào tôi có thể có được kích thước tế bào?
Để có chiều cao ô, phương thức ủy nhiệm đã được triển khai được gọi trong phương thức prepareLayout
của tùy chỉnh UICollectionViewLayout
. Phương pháp này được gọi là sau khi (hoặc hai lần, tôi chỉ cố gắng chạy nó với tuyên bố print
và tôi nhận được hai cuộc gọi). Điểm của prepareLayout
là để khởi tạo thuộc tính frame
của ô, nói cách khác, cung cấp kích thước chính xác của mỗi ô. Chúng ta biết rằng chiều rộng là hằng số, và chỉ có height
đang thay đổi, vì vậy trong dòng này của prepareLayout
:
let cellHeight = delegate.collectionView(collectionView!,
heightForItemAtIndexPath: indexPath, withWidth: width)
Chúng tôi có được chiều cao của tế bào từ các phương pháp đại biểu đã được thực hiện trong UICollectionViewController
. Điều này xảy ra cho tất cả các ô chúng tôi muốn hiển thị trong số collectionView
. Sau khi có được và sửa đổi chiều cao cho mỗi ô, chúng tôi lưu trữ kết quả để chúng tôi có thể kiểm tra sau này.
Sau đó, đối với collectionView
để lấy kích thước của mỗi ô trên màn hình, tất cả những gì cần làm là truy vấn bộ nhớ cache để biết thông tin. Điều này được thực hiện theo phương thức layoutAttributesForElementsInRect
của lớp tùy chỉnh UICollectionViewLayout
của bạn.
Phương pháp này được gọi tự động theo số UICollectionViewController
. Khi UICollectionViewController
cần thông tin bố cục cho các ô sắp tới trên màn hình (chẳng hạn như di chuyển, hoặc khi tải lần đầu tiên), bạn trả lại các thuộc tính từ bộ nhớ cache mà bạn đã điền trong prepareLayout
.
Khi kết thúc câu hỏi của bạn: Ở bước 2, tôi có thể lấy kích thước ô bằng cách nào và khi nào?
Trả lời: Mỗi kích thước tế bào thu được trong phương pháp prepareLayout
tùy chỉnh của bạn UICollectionViewFlowLayout
, và được tính sớm trong vòng đời của UICollectionView
của bạn.
Ở bước 3, làm cách nào và khi nào tôi có thể thông báo bố cục thay đổi?
Lưu ý rằng các hướng dẫn không tính đến các tế bào mới được bổ sung trong thời gian chạy:
Lưu ý: Như prepareLayout() được gọi bất cứ khi nào bố trí các điểm thu được không còn giá trị, có rất nhiều tình huống trong một điển hình triển khai nơi bạn có thể cần phải tính toán lại các thuộc tính tại đây. Ví dụ: các giới hạn của UICollectionView có thể thay đổi - chẳng hạn như khi định hướng thay đổi - hoặc các mục có thể được thêm vào hoặc xóa khỏi bộ sưu tập. Những trường hợp này nằm ngoài phạm vi của hướng dẫn này, nhưng điều quan trọng là phải nhận thức được chúng trong một triển khai không tầm thường.
Như ông đã viết, đây là một triển khai không nhỏ nhặt mà bạn có thể cần. Tuy nhiên, có một triển khai nhỏ (rất không hiệu quả) mà bạn có thể áp dụng nếu tập dữ liệu của bạn nhỏ (hoặc cho mục đích thử nghiệm). Khi bạn cần vô hiệu hóa bố cục vì xoay màn hình hoặc thêm/xóa ô, bạn có thể dọn bộ nhớ cache trong tùy chỉnh UICollectionViewFlowLayout
để buộc prepareLayout
khởi động lại thuộc tính bố cục.
Ví dụ, khi bạn phải gọi reloadData
trên collectionView, cũng thực hiện cuộc gọi đến lớp bố trí tùy chỉnh của bạn, để xóa bộ nhớ cache:
cache.removeAll()
Xin chào theo câu hỏi của bạn, bạn có thể tạo [UICollectionView] (http://www.appcoda.com/ios-programming-uicollectionview-tutorial/). Nhưng để tạo [UICollectionViewLayout] tùy chỉnh (http://www.raywenderlich.com/22324/beginning-uicollectionview-in-ios-6-part-12) với [ô tự định kích thước] (http://corsarus.com)/2015/collection-view-with-self-sizing-cells /). –