Đã quá muộn để trả lời câu hỏi này nhưng gần đây tôi đã xem xét vấn đề này. Câu trả lời trên
của @ lee giúp tôi rất nhiều để có câu trả lời cho mình. Nhưng câu trả lời đó chỉ giới hạn ở mục tiêu-c và tôi đã làm việc nhanh chóng .
@lee Với việc tham khảo câu trả lời của bạn, hãy cho phép tôi để người dùng nhanh chóng giải quyết vấn đề này một cách dễ dàng. Đối với điều đó, vui lòng làm theo các bước dưới đây:
Khai báo một CGFloat
biến trong phần khai báo:
var height : CGFloat!
Tại viewDidAppear
bạn có thể lấy nó bằng cách:
height = self.myCollectionView.collectionViewLayout.collectionViewContentSize().height
Có thể khi reload
dữ liệu của bạn cần tính độ cao mới với dữ liệu mới thì bạn có thể lấy nó bằng cách: addObserver
để lắng nghe khi CollectionView
tải lại xong dữ liệu của bạn tại viewWillAppear
:
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(true)
....
....
self.shapeCollectionView.addObserver(self, forKeyPath: "contentSize", options: NSKeyValueObservingOptions.Old, context: nil)
}
Sau đó thêm hàm dưới đây để có chiều cao mới hoặc làm bất cứ điều gì sau khi collectionview
tải lại xong:
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
let newHeight : CGFloat = self.myCollectionView.collectionViewLayout.collectionViewContentSize().height
var frame : CGRect! = self.myCollectionView.frame
frame.size.height = newHeight
self.myCollectionView.frame = frame
}
Và đừng quên xóa trình quan sát:
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(true)
....
....
self.myCollectionView.removeObserver(self, forKeyPath: "contentSize")
}
Tôi hy vọng điều này sẽ giúp bạn giải quyết vấn đề của mình nhanh chóng.