美文网首页ios开发文字上下滚动iOS学习专题
iOS文字滚动效果 之 纵向滚动

iOS文字滚动效果 之 纵向滚动

作者: JerryLMJ | 来源:发表于2016-07-14 17:43 被阅读6199次

实现效果:

从下到上无间隙滚动 从上到下无间隙滚动 从下到上有间隙滚动 从上到下有间隙滚动

Demo地址:https://github.com/MajorLMJ/LMJScrollTextView2
如果此demo帮助到你,请赐给一颗star,你的鼓励是我coding的动力

这个模块支持设置滚动方向(从上到下、从下到上)、文字颜色大小位置以及停留滚动时间的设置。

2018.5.29更新(2.2.2):
本次更新修复了在xib或storyboard中使用时出现了多个字条的显示错误;
优化Demo演示效果,并添加了在storyboard中使用本控件的演示。
2018.5.16更新(2.2.0):
本次更新支持了文字停留、滚动时间的设置以及修复bug:
(1)支持设置文字停留的时间,默认为3s
(2)支持设置文字动画单次滚动时间,默认为1s
(3)修复文字滚动时点击无法响应
2018.1.3更新(2.1.0):
本次更新在数据源textDataArr中支持了NSAttributedString类型数据,使能够显示的文字类型更加丰富。
2017.12.28更新(2.0.0):
本次更新在原有的基础上增加更多滚动方式、属性设置以及回调方法:
(1)由原来的有间隙滚动,增加到有间隙和无间隙两种滚动方式。方法分别是startScrollBottomToTopWithSpace、startScrollTopToBottomWithSpace、startScrollBottomToTopWithNoSpace、startScrollTopToBottomWithNoSpace
(2)增加了文字的对齐方式和是否可以响应点击设置
(3)增加了点击回调代理函数
2017.8.18更新(1.3.5):
修复了反复调用startScrollBottomToTop / startScrollTopToBottom方法会产生异常效果的问题。
2017.8.16更新(1.3.2):
在demo中添加了把控件添加到cell上的测试。
2017.7.29更新(1.3.1):
修复app进入后台后,循环速度剧增、消耗大量cpu的的问题。
2017.2.14更新(1.3.0):
修复进入其他页面后,循环速度剧增、消耗大量cpu的的问题。
2017.2.13更新(1.2.0):
添加了一个简单的代理回调,用于返回当前信息的序号。
2017.2.13更新(1.1.0):
有朋友说第一条数据走了两次,后来查找一下原因发现是定时器的问题。
修改后取消使用定时器,改用循环调用实现。

欢迎大家在评论区提出在使用中遇到的问题,博主会及时修复大家提出的问题!

主要实现:

#pragma mark - Scroll Action
- (void)scrollWithNoSpaceByDirection:(NSNumber *)direction{
    // 处于非当前页面,延迟尝试
    if (![self isCurrentViewControllerVisible:[self viewController]]) {
        [self performSelector:@selector(scrollWithNoSpaceByDirection:) withObject:direction afterDelay:DelayCallTime];
        
        
    // 处于当前页面
    }else{
        if (_textDataArr.count == 0) {
            _isRunning = NO;
            return;
        }else{
            _isRunning = YES;
        }
        
        _currentScrollLabel.lmj_text  = _textDataArr[_index];
        _standbyScrollLabel.lmj_text  = _textDataArr[[self nextIndex:_index]];
        _standbyScrollLabel.frame = CGRectMake(0, self.lmj_height*direction.integerValue, _standbyScrollLabel.lmj_width, _standbyScrollLabel.lmj_height);
        
        _index = [self nextIndex:_index];
        
        [UIView animateWithDuration:ScrollItemTime animations:^{
            
            _currentScrollLabel.frame = CGRectMake(0, -self.lmj_height*direction.integerValue, _currentScrollLabel.lmj_width, _currentScrollLabel.lmj_height);
            _standbyScrollLabel.frame = CGRectMake(0, 0, _standbyScrollLabel.lmj_width, _standbyScrollLabel.lmj_height);
            
        } completion:^(BOOL finished) {
            
            if ([self isCurrentViewControllerVisible:[self viewController]] && self.delegate && [self.delegate respondsToSelector:@selector(scrollTextView2:currentTextIndex:)]) { // 代理回调
                [self.delegate scrollTextView2:self currentTextIndex:_index];
            }
            
            UILabel * temp = _currentScrollLabel;
            _currentScrollLabel = _standbyScrollLabel;
            _standbyScrollLabel = temp;
            
            if (_needStop == NO) {
                [self performSelector:@selector(scrollWithNoSpaceByDirection:) withObject:direction afterDelay:ScrollItemTime];
            }else{
                _isRunning = NO;
            }
        }];
    }
}

- (void)scrollWithSpaceByDirection:(NSNumber *)direction{
    
    // 处于非当前页面,延迟尝试
    if (![self isCurrentViewControllerVisible:[self viewController]]) {
        [self performSelector:@selector(scrollWithSpaceByDirection:) withObject:direction afterDelay:DelayCallTime];
   
    // 处于当前页面
    }else{
        if (_textDataArr.count == 0) {
            _isRunning = NO;
            return;
        }else{
            _isRunning = YES;
        }
        
        _currentScrollLabel.lmj_text  = _textDataArr[_index];
        _currentScrollLabel.frame = CGRectMake(0, 0, _currentScrollLabel.lmj_width, _currentScrollLabel.lmj_height);
        
        [UIView animateWithDuration:ScrollItemTime animations:^{
            _currentScrollLabel.frame = CGRectMake(0, -self.lmj_height*direction.integerValue, _currentScrollLabel.lmj_width, _currentScrollLabel.lmj_height);
            
        } completion:^(BOOL finished) {
            
            _currentScrollLabel.frame = CGRectMake(0, self.lmj_height*direction.integerValue, _currentScrollLabel.lmj_width, _currentScrollLabel.lmj_height);
            _index = [self nextIndex:_index];
            _currentScrollLabel.lmj_text  = _textDataArr[_index];
            
            if ([self isCurrentViewControllerVisible:[self viewController]] && self.delegate && [self.delegate respondsToSelector:@selector(scrollTextView2:currentTextIndex:)]) { // 代理回调
                [self.delegate scrollTextView2:self currentTextIndex:_index];
            }
            
            
            [UIView animateWithDuration:ScrollItemTime animations:^{
                _currentScrollLabel.frame = CGRectMake(0, 0, _currentScrollLabel.lmj_width, _currentScrollLabel.lmj_height);
                
            } completion:^(BOOL finished) {
                
                if (_needStop == NO) {
                    [self performSelector:@selector(scrollWithSpaceByDirection:) withObject:direction afterDelay:ScrollItemTime];
                }else{
                    _isRunning = NO;
                }
            }];
        }];
    }
}

Demo地址:
https://github.com/MajorLMJ/LMJScrollTextView2
如果此demo帮助到你,请赐给一颗star,你的鼓励是我coding的动力

版权声明:出自MajorLMJ技术博客的原创作品 ,转载时必须注明出处及相应链接!

相关文章

网友评论

  • 03d1a23082e1:cpu飙升:cold_sweat:
  • mapley:你好,谢谢分享,想问下这是只能一条不能两条同时滚动的对吗?
    JerryLMJ:@mapley 是淘宝首页淘宝头条那种效果么?这种目前还不支持
    mapley:@MajorLMJ 是的,就是同时显示两条,两条同时滚动
    JerryLMJ:@mapley 你指的两条同时滚动是?
  • bc27b76c36a7:textDataArr变化时页面刷新,这时候滚动动画混乱了,如何处理,如何reset状态
  • 2dc5b695c786:你好,我把控件背景颜色设置为白色,然后title字体颜色为黑色,这时候会出现控件上有一个,然后下方还有一个
    JerryLMJ:@差点是男神 简信发我一下你的代码 我看一下
    2dc5b695c786:这个怎么解决
  • 七彩童话:用起来是挺好 但是我有两个问题:1.没有控制停留时间的属性啊?想要一条数据停留5秒在滚动下一条,并且第一条数据要开始就默认展示;2. 我适当的修改了一下 ,时间间隔调到5秒的话 ,第一条数据刚出现就会滚动到第二条 ,第二条才开始正常?
    JerryLMJ:你好,你提的问题已经修复,新版本中添加了 textStayTime 和 scrollAnimationTime 两个属性,可以通过这两个属性控制文字停留时间和滚动动画的时间,可以尝试下载新版本使用
  • 24号的信仰_1337:你好,请问如果我要加图片来跟文字一起滚动,怎么实现?
    JerryLMJ:2018.1.3更新(2.1.0):
    本次更新在数据源textDataArr中支持了NSAttributedString类型数据,使能够显示的文字类型更加丰富。
    可以利用NSAttributedString进行复杂的富文本展示,包括添加图片,关于NSAttributedString的使用可以参考我之前的一篇文章https://www.jianshu.com/p/9ffcdc0003e0
  • 24号的信仰_1337:为什么刚进去是黑色的,label上面没有文字,要等一会儿文字才会出来,这个是bug吧。请问怎么修改,我现在默认选了一种模式,但是运行的时候还是黑屏,要等一会儿文字才出来,怎么改?
  • faea015d2bac:你好,写的很好,很完美,但是有个问题就是:当字符串长度小于控件的宽度就不滚动了。请问这个如何去解决呢?
    faea015d2bac:@MajorLMJ 额,感谢你的回复。我已经解决了。将你的代码中注释了一些。解决了字符串长度小于控件的宽度,字体不再滚动的问题。
    JerryLMJ:@BennyBai 理论上是不会的,能说的详细写么
  • 吉s她Hmm:楼主 你的GitHub 进不去啊 下载不了啊
    吉s她Hmm:@MajorLMJ 方便的话发一份dome 新手 不怎么懂你说的VPN
    吉s她Hmm:@MajorLMJ 开VPN VPN地址什么啊?
    JerryLMJ:@吉s她Hmm 开vpn
  • 傲凡玉蝶:退出到后台再进入有时候动画会混乱
    JerryLMJ:@傲凡玉蝶 因为看不到你添加控件到cell上的代码,所以不能确定具体是什么原因导致的,你可以看一下是不是cell复用所引起的。我也更新了一下demo,在demo中写了一个添加到cell上的测试,目测应该是没有问题的。
    欢迎进一步讨论。
    傲凡玉蝶:@MajorLMJ 我是把你的组件放到cell中的,这时候我把应用切到后台,过一段时间再返回到前台,这时候滚动效果有时候会很快一直一闪动而过
    JerryLMJ:你好,能说的更详细一些么
  • Lamet03:进入后台,CPU飙升
    傲凡玉蝶:退出到后台在进入前台有时候动画会混乱
    JerryLMJ:谢谢你提出的问题,已修复,可以下载新的demo
  • alelaile:兄弟 你这cup过高是什么原因啊 我昨天刚刚发现会是cup超过100
    alelaile:@MajorLMJ 我是放在cell里面 去其他vc的时候 cup100多
    JerryLMJ:不好意思,最近比较忙,能描述一下你当时导致cpu过高是在什么情况下产生的么
  • 咖啡绿茶1991:如果同时要显示两行文字 要怎么做啊
    黄dog:numberOfLines = 0;
  • 一脸盐汽水:在走的时候点击再次点击开始,好像速度变快了
  • MasterY:其他的都挺好 动画效果不是等一个完全离开在出来另一个就好了 。中间空白显得很尴尬
    JerryLMJ:@030ab0eab152 demo已经更新,在原有基础上增加没有间隙的滚动效果
    姚琥珀:@MajorLMJ 作者你好,如何做到动画效果不是等一个完全离开在出来另一个,中间不要有空白的效果
    JerryLMJ:是的,打期近期新加一个中间没有空档的
  • 4598e8d8ab28:对,第一条数据走了两遍,作者解决一下吧!
    JerryLMJ:@天蝎座耿小哥er 我这的CPU report显示0%,你看看是不是你项目中的其他进程占用了cup。虽然是循环调用,但是并不是高频的
    4598e8d8ab28:@MajorLMJ 修改之后还是有点问题,运行在项目中CPU占用一直是100%之上,因为在[self scrollBottomToTop];这个方法中循环引用了它自身。作者大大看下吧!
    JerryLMJ:已修改
  • 23d95ce2a289:再添加点击回调事件就完美了!
    JerryLMJ:添加了一个简单的回调
    4598e8d8ab28:添加手势
    JerryLMJ:@Jairo 好的,有时间会进一步完善的
  • narutog17:有一个问题 ,第一条数据走了两次 ,在刚运行的时候
    JerryLMJ:已修改
  • narutog17:不错。。。。简单易懂。。。 good !!!

本文标题:iOS文字滚动效果 之 纵向滚动

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