美文网首页
ios 在cell上添加跑马灯最佳实现方案

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

作者: nevermore_子高 | 来源:发表于2018-08-09 11:33 被阅读0次

    首先,在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上的动画,都可以用相同的思路来实现,如果有更好的方法,还请各位不吝赐教,共同探讨,共同进步.

    相关文章

      网友评论

          本文标题:ios 在cell上添加跑马灯最佳实现方案

          本文链接:https://www.haomeiwen.com/subject/hsetoxtx.html