Как узнать, что UICollectionView полностью загружен? Я пытаюсь воспроизвести это решение в Swift, но у меня проблемы с чтением Obj- C. Может кто-нибудь помочь?
Когда полностью загружается UICollectionView?
Ответ 1
Если вы хотите использовать подход из связанного с вами вопроса, тогда:
override func viewDidLoad() {
super.viewDidLoad()
self.collectionView?.addObserver(self, forKeyPath: "contentSize", options: NSKeyValueObservingOptions.Old, context: nil)
}
override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) {
if let observedObject = object as? UICollectionView where observedObject == self.collectionView {
print(change)
}
}
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
self.collectionView?.removeObserver(self, forKeyPath: "contentSize")
}
Ответ 2
SWIFT 3: версия ответа @libec
override func viewDidLoad() {
super.viewDidLoad()
collectionView.addObserver(self, forKeyPath: "contentSize", options: NSKeyValueObservingOptions.old, context: nil)
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
collectionView.removeObserver(self, forKeyPath: "contentSize")
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if let observedObject = object as? UICollectionView, observedObject == collectionView {
print("done loading collectionView")
}
}
Ответ 3
Позднее ответить,
В viewDidAppear вы можете получить его:
float height = self.myCollectionView.collectionViewLayout.collectionViewContentSize.height;
Возможно, когда вы перезагружаете данные, тогда вам нужно вычислить новую высоту с новыми данными, тогда вы можете получить ее: добавьте наблюдателя, чтобы слушать, когда ваш CollectionView закончил перезагружать данные в viewdidload:
[self.myCollectionView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionOld context:NULL];
Затем добавьте следующую функцию, чтобы получить новую высоту или сделать что-либо после завершения загрузки коллекции:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
//Whatever you do here when the reloadData finished
float newHeight = self.myCollectionView.collectionViewLayout.collectionViewContentSize.height;
}
И не забудьте удалить наблюдателя:
Напишите код в viewWillDisappear
[self.myCollectionView removeObserver:self forKeyPath:@"contentSize" context:NULL];
Для получения дополнительной информации зайдите в ответ fooobar.com/questions/68415/...
Ответ 4
В моем случае проблема заключалась в том, что представление коллекции не было полностью перезагружено, поэтому нам нужно подождать, пока не откроется представление коллекции reloadData:
self.customRecipesCV.reloadData()
DispatchQueue.main.async {
if let _index = self.selectCustomRecipeAtIndex {
let nextIndexpath = IndexPath(row:index, section:0)
self.customRecipesCV.scrollToItem(at: nextIndexpath, at: .centeredHorizontally, animated: true)
}
}