滚动原理
之前项目有一个简单的广告滚动效果,就自己动手写了一个,比较简单,原理就是两个label的循环替换,可以向上滚动和向下滚动。
实现
YJAutoScrollLabel *autoScroll = [[YJAutoScrollLabel alloc] initWithFrame:CGRectMake(20, 100, self.view.frame.size.width - 40, 50) titles:@[@"123123123",@"456456456",@"789789789",@"147147147",@"258258258"]];
[self.view addSubview:autoScroll];
开始滚动
[autoScroll beginScroll];
停止滚动
[autoScroll closeScroll];
广告消息的一些属性设置:
autoScroll.time = 2;//定时器轮询一次的时间 默认2s
autoScroll.adFontSize = 14;//广告文字字体大小 默认16
autoScroll.adTextAlignment = NSTextAlignmentCenter;//广告文本字体设置 默认NSTextAlignmentLeft
autoScroll.adColor = [UIColor redColor];//广告文字的颜色 默认黑色
autoScroll.adNumberOfLines = 0;//广告文字的行数 默认1行
autoScroll.isHaveTouchEvent = YES;//广告是否可以点击 默认不可点击
autoScroll.margen = 20;//广告文本距离左边的边距 默认是10
原理分析
- 创建两个label,第一个是当前显示的label,第二个是隐藏的,处在view的上面或者下面(如果向上滚动,隐藏的label则在下面,如果向下滚动,隐藏的label则在上面)。
- 设置第一个label的文字为数据源的第一条数据,然后显示。
- 开启定时器循环,遍历当前view的subViews,根据label的text和广告数组index的数据相比,判断是currentLabel还是hiddenLabel。
然后进行currentLabel和hiddenLabel向上或者向下滚动的动画,将currentLabel滚动到界外,将hiddenLabel滚动到当前显示。
CGFloat labelY = self.directionType == YJScrollDirectionTypeTop ? -kHeight : kHeight;
[UIView animateWithDuration:1 animations:^{
currentLabel.frame = CGRectMake(_margen, labelY, kWidth - _margen, kHeight);
hiddenLabel.frame = CGRectMake(_margen, 0, kWidth - _margen, kHeight);
} completion:^(BOOL finished) {
currentLabel.frame = CGRectMake(_margen, -labelY, kWidth - _margen, kHeight);
}];
- 动画结束,将currentLabel位置放在即将显示的位置。
currentLabel.frame = CGRectMake(_margen, -labelY, kWidth - _margen, kHeight);