一种简洁的文字轮播 DNVerticalTextScrollView

前言:本人小白,写的不好,请大家多多指教。


文字轮播.gif
  1. 新建一个类继承自UIView,在这里名为 DNVerticalTextScrollView
  2. .h 文件中
    1) 代理
// 点击文字轮播的代理
@protocol DNVerticalTextScrollViewDelegate <NSObject>

@optional;
// 使用代理方法回调 Label 点击手势
- (void)dn_textScrollViewSelectedAtIndex:(NSInteger)index content:(NSString *)content;
@end

2) 外部可传入的参数

// 滚动的文字数组
@property (nonatomic,   copy) NSArray *dataArray;
// 文本的颜色
@property (nonatomic, strong) UIColor *textColor;
// DNVerticalTextScrollView 的背景颜色
@property (nonatomic, strong) UIColor *BGColor;
// 字体大小
@property (nonatomic, assign) CGFloat textFontSize;
// 代理
@property (nonatomic, weak) id<DNVerticalTextScrollViewDelegate> delegate;
// 创建方法(可用init或initWithFrame方法,传入数组 dataArray)
- (instancetype)initWithDataArray:(NSArray *)dataArray;    
  1. .m实现文件
    1) 懒加载 UIScrollView
- (UIScrollView *)bgScrollView {
    
    if (!_bgScrollView) {
        _bgScrollView = [[UIScrollView alloc] init];
        _bgScrollView.backgroundColor = UIColor.clearColor;
        // 不显示水平滚动条
        _bgScrollView.showsHorizontalScrollIndicator = NO;
        // 不显示竖直滚动条
        _bgScrollView.showsVerticalScrollIndicator = NO;
        _bgScrollView.scrollEnabled = NO;
        _bgScrollView.pagingEnabled = YES;
        _bgScrollView.bounces = NO;
        _bgScrollView.delegate = self;
        [self addSubview:_bgScrollView];
    }
    return _bgScrollView;
}

2)根据 initWithDataArray 创建方法或者外部传入的 dataArray 得到数据,设置 ScrollView 的 contentSize,创建 Label,并用代理回调 Label 的点击手势事件

// 防止重复添加
    [self.bgScrollView.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        
        [obj removeFromSuperview];
    }];
// 遍历数组,创建 UILabel
    [self.dataArray enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        
        UILabel * label = [self createScrollTextLabelWithTag:idx text:obj];
        [self.bgScrollView addSubview:label];
    }];       
- (UILabel *)createScrollTextLabelWithTag:(NSInteger)tag text:(NSString *)text {
    
    UILabel * label = [[UILabel alloc] init];
    label.text = text;
    label.userInteractionEnabled = YES;
    label.font = [UIFont systemFontOfSize:titleFontSize];
    label.textColor = titleTextColor;
    label.textAlignment = NSTextAlignmentCenter;
    label.frame = CGRectMake(0, tag*self.frame.size.height, self.frame.size.width, self.frame.size.height);
    // 添加点击事件
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(clickTheLabel:)];
    [label addGestureRecognizer:tap];
    tap.view.tag = tag;
    
    return label;
}

// 手势的响应事件
- (void)clickTheLabel:(UITapGestureRecognizer *)gesture {
    // 使用代理方法回调 Label 的点击事件
    if (self.delegate && [self.delegate respondsToSelector:@selector(dn_textScrollViewSelectedAtIndex:content:)]) {
        
        [self.delegate dn_textScrollViewSelectedAtIndex:gesture.view.tag
                                                   content:self.dataArray[gesture.view.tag]];
    }
} 

至此界面搭建基本完成,然后添加定时器,让文字滚动起来

#pragma mark - - - NSTimer
- (void)addTimer {
    
    /*
     scheduledTimerWithTimeInterval:  滑动视图的时候timer会停止
     这个方法会默认把Timer以NSDefaultRunLoopMode添加到主Runloop上,而当你滑tableView的时候,就不是NSDefaultRunLoopMode了,这样,你的timer就会停了。
     */
    [self removeTimer];
    self.timer = [NSTimer timerWithTimeInterval:3
                                         target:self
                                       selector:@selector(nextLabel)
                                       userInfo:nil
                                        repeats:YES];
    [[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
}

// 定时器的响应事件
- (void)nextLabel {
    
    CGPoint oldPoint = self.bgScrollView.contentOffset;
    oldPoint.y += self.bgScrollView.frame.size.height;
    [self.bgScrollView setContentOffset:oldPoint animated:YES];
}
- (void)removeTimer {
    [_timer invalidate];
    _timer = nil;
}

当 scrollView 的contentoffset 滚动到设置的 contentSize 的位置是就没法向下滚动了,所以这时我们再代理中将 contentOffset 设置为起始的 contentOffset

#pragma mark -- UIScrollView Delegate

//当滚动时调用scrollView的代理方法
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    // 当滚动到最底部时,返回(0,0)
    CGFloat currentOffset = self.bgScrollView.frame.size.height*(self.dataArray.count);
    if (self.bgScrollView.contentOffset.y == currentOffset) {
        [self.bgScrollView setContentOffset:CGPointMake(0, 0) animated:NO];
    }
}

这样一个文字轮播基本就完成了,但是当我们的 scrollView 滚动的时候,定时器还是在运作的,所以我们应当在 scrollView 的代理方法中设置定时器的开启或移除

// 开始拖拽的时候调用
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    
    [self removeTimer];
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
    //开启定时器
    [self addTimer];
}

最后,在 dealloc 中移除定时器

- (void)dealloc {
    [_timer invalidate];
    _timer = nil;
}

demo地址DNVerticalTextScrollView

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生x阅读 15,967评论 3 119
  • python的send2trash模块,顾名思义就是把一个文件丢入回收站。
  • 室友说,你考不上的,那个证那么那么难。可是,我还是想考,室友的万般阻挠下,我终于崩溃了。忍不住的给妈妈打了电话,记...
    嘉善1996阅读 167评论 0 2
  • 很多遇见总是沧海一粟般地在风霜雨雪之后,美丽而又苍茫地笼罩长河的上空,温柔着漫漫人生路。 春雨和风云是以原告和法官...
    雪心雨心阅读 202评论 0 1