Đã 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 CGFloatbiến trong phần khai báo:
var height : CGFloat!
Tại viewDidAppearbạn có thể lấy nó bằng cách:
height = self.myCollectionView.collectionViewLayout.collectionViewContentSize().height
Có thể khi reloaddữ 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 CollectionViewtả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 collectionviewtả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.