樓主最近遇到一個需求:在某個頁面中添加一個collectionView颅悉,collectionView的高度隨著數據源的長度來改變,從而達到改變父View的高度栗竖,如下圖紅框部分則為collectionView,整個視圖布局在scrollview上,由collectionView的高度去撐父視圖的高度晦攒。樓主試圖通過監(jiān)聽collectionView的數據源長度來改變視圖高度。
image.png
但我們知道涧卵,KVO監(jiān)聽的是指針變化勤家,可變數組里加了個元素,這個數組的內容變了柳恐,但是指針沒有變伐脖,所以不會調用KVO。但還好有萬能的簡書乐设,樓主搜到一篇文章正合心意讼庇,具體可參見:http://www.reibang.com/p/f9fa928173ae
但樓主發(fā)現其實實踐起來無需這邊博主這么麻煩,我們只要每次都變更我們要監(jiān)聽數據的地址就好了近尚。因此簡化版操作如下蠕啄,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];
}