楼主最近遇到一个需求:在某个页面中添加一个collectionView,collectionView的高度随着数据源的长度来改变,从而达到改变父View的高度,如下图红框部分则为collectionView,整个视图布局在scrollview上,由collectionView的高度去撑父视图的高度。楼主试图通过监听collectionView的数据源长度来改变视图高度。
但我们知道,KVO监听的是指针变化,可变数组里加了个元素,这个数组的内容变了,但是指针没有变,所以不会调用KVO。但还好有万能的简书,楼主搜到一篇文章正合心意,具体可参见://www.greatytc.com/p/f9fa928173ae
但楼主发现其实实践起来无需这边博主这么麻烦,我们只要每次都变更我们要监听数据的地址就好了。因此简化版操作如下,mediaUploadView是包含了collectionView的直接父视图,seleteImagesArray为collectionView的数据源
//1.建立观察者以及观察者对象
[self.mediaUploadView addObserver:self forKeyPath:@"seleteImagesArray" options:NSKeyValueObservingOptionNew context:nil];
//2.数组的增删方法(注意这里的写法,用mutableArrayValueForKey,这个不仅把元素加进去了, 而且还重新生成了一个可变数组来赋值给控制器属性的那个数组,这样就能被KVO检测到指针变化)
[[weakself mutableArrayValueForKey:@"seleteImagesArray"] addObject:weakself.addImageModel];
[[weakself mutableArrayValueForKey:@"seleteImagesArray"] removeLastObject];
[[weakself mutableArrayValueForKey:@"seleteImagesArray"] addObjectsFromArray:tempArray];
//3.处理Key的变化
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
NSInteger rows = ceilf(self.mediaUploadView.seleteImagesArray.count/3.0);
self.meadiaUploadViewHeight.constant = (ITEM_WIDTH_HEIGHT+20)*rows;
}
//4.最后一步也很重要,否则引起崩溃
- (void)dealloc {
[self.mediaUploadView removeObserver:self forKeyPath:@"seleteImagesArray" context:nil];
}