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