ios 在cell上添加跑马灯最佳实现方案

2018-08-09  本文已影响0人  nevermore_子高

首先,在cell上添加跑马灯需要考虑的是tableView的优化问题,想象一下:如果你的每个cell上都有一个跑马灯在滚动,你是怎么处理在视图快速滑动时带来的复用问题及卡顿问题.

跑马灯是一个无限循环的动画,计时器开销太大并且无数个cell需要创建无数个计时器?此时用CADisplayLink实现就是比较好的选择,根据刷新频率,不停的调整视图的位置就行.注意:此时只需要一个定时器,放在VM或者C里面,刷新时给各个cell发送通知或者获取每个需要刷新的cell来执行动画.这里不再详细介绍.

其次,在滚动过程中每个cell上的动画会让主线程阻塞,非常卡顿,这时候需要新开一个runloop,将跑马灯放在其中,视图滚动操作的时候休眠,等主线程空闲的时候再跑起来.这样就非常流畅了

这里贴上部分代码:

- (void)startMove

{

    [self stopMove];

    self.weakProxy = [LLDelayPerformAgent   agentWithObserver:self];

    self.displayLink= [CADisplayLink   displayLinkWithTarget:self.weakProxyselector:@selector(updateScrolling)];

    _displayLink.frameInterval = 2;

    [self.displayLink  addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

}

- (void)updateScrolling

{

    BOOL bContentReduced =_contentLabel.left>0;    // 是否是第一个label的left从正变为负

    BOOL bCopyReduced =_copyContentLabel.left>0;    // 是否是copyLabel的left从正变为负

    _contentLabel.left -= 1;

    _copyContentLabel.left -= 1;

    if (bCopyReduced && _copyContentLabel.left <= 0 && _contentLabel.left < 0) {

        _contentLabel.left = self.width + _contentWidth;

    }elseif(bContentReduced &&_contentLabel.left<=0&&_copyContentLabel.left<0) {

        _copyContentLabel.left = self.width + _contentWidth;

    }

}

- (void)stopMove

{

    [self.displayLink invalidate];

    self.displayLink = nil;

    [NSObject   cancelPreviousPerformRequestsWithTarget:self selector:@selector(startMove) object:nil];

}

此文书写较为仓促,仅提供些许自己的理解及思路,需要此跑马灯控件的可以私信我.其实只要是在cell上的动画,都可以用相同的思路来实现,如果有更好的方法,还请各位不吝赐教,共同探讨,共同进步.

上一篇下一篇

猜你喜欢

热点阅读