用KVO来监听 UICollectionView及 contentSize、contentOffset和contentInset的图解辨别

摘要:
//懒加载UICollectionView-(UICollectionView*)myCollectionView{if(!82:0);CGFloatheight=GET_SCREN_HEIGHT-(64+(isPad?

// 懒加载  UICollectionView

- (UICollectionView *)myCollectionView {

    if (!_myCollectionView) {

        UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc]init];

        CGFloat width   = GET_SCREEN_WIDTH-(isPad?82:0);

        CGFloat height  = GET_SCREEN_HEIGHT-(64+(isPad?20:0));

        self.myCollectionView = [[UICollectionView alloc]initWithFrame:CGRectMake(0, 0, width, height) collectionViewLayout:flowLayout];

        _myCollectionView.backgroundColor = [UIColor clearColor];

        _myCollectionView.scrollEnabled = false;

        _myCollectionView.delegate = self;

        _myCollectionView.dataSource = self;

        

//        _myCollectionView.contentInset = UIEdgeInsetsMake(64, 0, 20, 0);

//        _myCollectionView.userInteractionEnabled = NO;

        [self registerMyCell];

        [self p_registerObserve];

    }

    return _myCollectionView;

}

#pragma mark - KVO

- (void)p_registerObserve {

    if (_myCollectionView) {

        [_myCollectionView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:kCollectionViewContentSizeContext];

    }

}

- (void)p_deregisterObserve {

    // 这里不使用点语法触发懒加载,因为可能在这里才触发懒加载创建collectionView,此时还没有添加观察者

    // 如果这时移除观察者很可能会造成崩溃

    if (_myCollectionView) {

        [_myCollectionView removeObserver:self forKeyPath:@"contentSize" context:kCollectionViewContentSizeContext];

    }

}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {

    if (context == kCollectionViewContentSizeContext) {        

        CGSize contentSize = [change[NSKeyValueChangeNewKey] CGSizeValue];

        CGFloat width   = GET_SCREEN_WIDTH-(isPad?82:0);

        self.myCollectionView.frame = CGRectMake(0, 0, width, contentSize.height);

        self.baseTableView.tableFooterView = self.myCollectionView;

    }

}

免责声明:文章转载自《用KVO来监听 UICollectionView及 contentSize、contentOffset和contentInset的图解辨别》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇WINCE系统声音定制conda中重要的三个概念:环境、通道和包下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

KVO的底层实现原理?如何取消系统默认的KVO并手动触发?

KVO是基于runtime机制实现的 当某个类的属性对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类(该类的子类),在这个派生类中重写基类中任何被观察属性的setter 方法。派生类在被重写的setter方法内实现真正的通知机制 如果原类为Person,那么生成的派生类名为NSKVONotifying_Person 每个类对象中都有一个...

KVC

1、概念: KVC(Key-value coding):键值对编码,也就是我们可以通过变量的名称来读取或者修改它的值,而不需要调用明确的存取方法。这样就可以在运行时动态地访问和修改对象的属性。而不是在编译时确定。对于类里的私有属性,Objective-C是无法直接访问的,但是KVC是可以的。 作用: 取值和赋值(开发中基本不用) 获取对象私有变量的值.(...