scrollview复用节点_UIscrollView 的子视图复用

复用原理:

1.添加一个可视集合,一个重用集合;

@property (nonatomic, strong) NSMutableSet *visibleLabels;

@property (nonatomic, strong) NSMutableSet*reusedLabels;

2.刚开始创建单屏多N个的子视图(N=1,2,3都可以),这里我创建的是9+2=11个label

for (int i=0; i

[self showLabelAtIndex:i];

}

3.创建的时候这里首先从重用集合中取,有就去掉取出的label,没有就创建,类似cell;

创建的时候再对label进行相关的个性设置,方法跟 cellForRowAtindexPath:类似

- (void)showLabelAtIndex:(NSInteger)index {

JAYChartLabel*label =[self.reusedLabels anyObject];if(label) {

[self.reusedLabels removeObject:label];

}else{

label=[[JAYChartLabel alloc] init];

}

CGRect labelFrame= CGRectMake(JAYYLabelwidth-_xLabelWidth*.5 +index * _xLabelWidth+_xLabelWidth*_flag, _myScrollView.frame.size.height-kBottomXLabelsH-JAYLabelHeight*0.5, _xLabelWidth, kBottomXLabelsH);

label.frame=labelFrame;

label.tag=index;

label.text=[self.labelNames objectAt:index];

[self.visibleLabels addObject:label];

[_myScrollView addSubview:label];

}

4.处理scrollView滑动时候的代理

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

[self showMoreLabels];

}

5.处理滑动过程中的操作:(关键)

a.先获取当前scorllView的contentoffset,或者是bounds,即相比于最初滑动的偏移,找出偏移点即屏幕当前的可视范围;

b.计算可视范围的起始下标以及终止下标,要注意处理数组越界的问题;

c.遍历可视集合中的元素,把不在可视范围的元素添加到重用集合中,并把可视集合中所有在重用集合的元素删除;

d.判断新的在可视范围的下标,是否存在于可视数组中,若存在就不处理,不存在,即表示需要从重用集合中添加;并重新赋值;

- (void)showMoreLabels

{

CGRect visibleBounds=_myScrollView.bounds;

CGFloat minX=CGRectGetMinX(visibleBounds);

CGFloat maxX=CGRectGetMaxX(visibleBounds);

NSInteger firstIndex= (NSInteger)floorf((minX-JAYYLabelwidth)/_xLabelWidth);

NSInteger lastIndex= (NSInteger)floorf((maxX-JAYYLabelwidth)/_xLabelWidth);if (firstIndex<0) {

firstIndex= 0;

}if (lastIndex>=[self.labelNames count]) {

lastIndex= [self.labelNames count]-1;

}/*回收不在范围的Label*/NSInteger labelIndex=0;for (JAYChartLabel *label inself.visibleLabels) {

labelIndex=label.tag;if (labelIndexlastIndex) {

[self.reusedLabels addObject:label];

[label removeFromSuperview];

}

}

[self.visibleLabels minusSet:self.reusedLabels];/*判断是否在显示,没有显示则添加*/

for (NSInteger index = firstIndex; index<=lastIndex; index++) {

BOOL isShow=NO;for (JAYChartLabel *label inself.visibleLabels) {if (label.tag ==index) {

isShow=YES;

}

}if (!isShow) {

[self showLabelAtIndex:index];

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值