邏輯有時候需要在加載完 UITableView、UICollectionView的內容后,確定其高度或寬度來改變它的Frame,這時候可以巧妙地使用KVO添加對其 contentSize 的監聽進行處理,以 UICollectionView 為例,邏輯需要在 UICollectionView 加載完后,拿到內容大小進行處理其Frame,在添加 UICollectionView 的 view 初始化方法中,添加監聽即可;
添加監聽-監聽方法處理-移除監聽;
添加監聽-監聽方法處理-移除監聽;
添加監聽-監聽方法處理-移除監聽;
添加監聽
[self.collectionView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:nil];
監聽方法
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context { if(object == self.collectionView){ if ([keyPath isEqualToString:@"contentSize"]) { if(_collectionView.contentSize.height == _contentHeight) return; _contentHeight = _collectionView.contentSize.height; ///對其拿到的高或者寬進行處理 } } }
移除監聽
- (void)dealloc { [self.collectionView removeObserver:self forKeyPath:@"contentSize"]; }