色 从图中看可以到 无论左滚右滚 绿色始终是Labels[0](将要消失的Label) 红色始终是Label[1]
正常滚动情况下:
绿色的offsetX值随着speed而变 : self.offsetX = self.offsetX - sign * self.speed;
红色的X值会随着绿色的offsetX和固定间距的关系而变 : CGFloat nextOffX = self.offsetX + sign * (((self.orientation == RollingOrientationLeft)? firstRect.size.width : lastRect.size.width) + self.internalWidth);
通过_currentIndex值从保存到的数据中获取到红色、绿色的内容和大小后赋值:
当绿色消失的一瞬间:
本该是在右边的红色一下子吓绿了 : self.offsetX = _labels[1].frame.origin.x;
消失的绿色又将会按照正常滚动的情况下变为红色
_currentIndex指得始终是绿色内容的索引: _currentIndex = (_currentIndex + 1) % _textArray.count;
通过这个值又将会获取按照正常滚动的情况下 红色、绿色的大小和文本内容
(两个又将会进行的流程将会在"正常滚动情况下"的蓝色部分操作)
}
好了 解释到此结束 看着好累。。。。 慢着 还有点击事件没写完
点击事件:在给UILabel添加了Tap手势后进行处理
-(void)labelTap:(UITapGestureRecognizer *)gesture{
NSInteger tag = ((UILabel *)[gesture view]).tag - 100;
NSInteger index;
if(tag == 0){ //如果是(Labels[0])绿色
index = _currentIndex;
}else if (tag == 1){ //如果是(Labels[1])红色 就是当前点击的后一个
index = (_currentIndex + 1) % _textArray.count;
}else{
index = _currentIndex;
} if(self.labelClickBlock){
self.labelClickBlock(index);
}
}
终点
代码见GitHub: ====> YFRollingLabel PS:源码以及GitHub文档都是用蹩脚的英语写的,也不知道会不会有人看。。
另外说明记录存在的问题:
对于放入的文本数组 长度不能太短 因为里面只有两个UILabel 如果长度太短的话 并且间距也小的情况下
在绿色刚消失后, 又会立马变为红色,出现在目前的绿色右边,而不是慢慢的移动出现。
文本太长太长的话(几百个中文,正常情况下不会设置这么多吧), 会导致获取的文本宽度过长,UILabel宽度过长,文本直接就不显示了,但点击事件还是有的 说明了还存在。。。这就搞不懂。。。
好了,终于写完了,Windows 10 Mobile 万岁!!!
PS:新的知识点:CADisplayLink
CADisplayLink 是一个能让我们以和屏幕刷新率相同的频率(每秒60次)将内容画到屏幕上的定时器。
但如果调用的方法比较耗时,超过了屏幕刷新周期,就会导致跳过若干次回调调用机会。
//创建
CADisplayLink displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(doSomeThing:)];
[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
//设置是否停止
displayLink.Pause = NO/YES;
//释放
[displayLink invalidate];
displayLink = nil;
|