無限向上滾動公告實(shí)現(xiàn)

思路:一般公告都是以文本為主,所以使用UIScrollView+UILabel便可以實(shí)現(xiàn)。由于項(xiàng)目需求,滾動公告一行需要展示4個UILabel,第四個UILabel的textColor不一樣,且一次展示多行,效果如下圖,所以考慮使用UIScrollView+UITableView。

公告滾動圖

.h文件

#import <UIKit/UIKit.h>

@interface NoticeScrollView : UIView

@property (strong, nonatomic) UIScrollView *MainScrollView;
@property (nonatomic, strong) UITableView *scrollTableView;

@property (nonatomic, copy) NSMutableArray *dataArr;//將數(shù)據(jù)傳入

@end

.m文件

#import "NoticeScrollView.h"

const int  showRows = 5;//公告一次性展示的行數(shù)
const float showRowsHeight = 44; //公告每行的高度

@interface NoticeScrollView ()<UITableViewDataSource,UITableViewDelegate,UIScrollViewDelegate>

/* 定時器  */
@property (nonatomic,strong) NSTimer *timer;

@end

@implementation NoticeScrollView

- (instancetype)initWithFrame:(CGRect)frame {
    
    if (self = [super initWithFrame:frame]) {
        [self addSubview:self.MainScrollView];
    }
    return self;
}

- (void)setDataArr:(NSMutableArray *)dataArr {
    
    _dataArr = dataArr;
    self.MainScrollView.contentSize = CGSizeMake(SCREEN_WIDTH, showRowsHeight * _dataArr.count);
    self.scrollTableView.frame = CGRectMake(0, 0, SCREEN_WIDTH, showRowsHeight * _dataArr.count);
    [self.scrollTableView reloadData];
    [self removeTimer];
    if (_dataArr.count > showRows) {
        [self addTimer];
    }
}

- (void)addTimer {
    /*
     scheduledTimerWithTimeInterval:  滑動視圖的時候timer會停止
     這個方法會默認(rèn)把Timer以NSDefaultRunLoopMode添加到主Runloop上,而當(dāng)你滑tableView的時候,就不是NSDefaultRunLoopMode了,這樣,你的timer就會停了。
     self.timer = [NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(nextLabel) userInfo:nil repeats:YES];
     */
    
    self.timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(nextLabel) userInfo:nil repeats:YES];
    [[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
}

- (void)nextLabel {
    
    CGPoint oldPoint = self.MainScrollView.contentOffset;
    oldPoint.y += showRowsHeight;
    [self.MainScrollView setContentOffset:oldPoint animated:YES];
}

#pragma mark 【 UITableViewDataSource 】
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; {
    
    return _dataArr.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; {
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"myCell"];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"myCell"];
    }
    [cell.contentView removeAllSubviews];
//需要公告顯示什么就往contentView上添加什么即可
    for (int i = 0; i < 4; i++) {
        UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(i*SCREEN_WIDTH/4, 0, SCREEN_WIDTH/4, showRowsHeight)];
        label.textAlignment = NSTextAlignmentCenter;
        label.font = DetailTextFont;
        label.textColor = [UIColor darkGrayColor];
        NSArray *arr = [_dataArr objectAtIndex:indexPath.row];
        if (_dataArr.count > 0) {
            label.text = [arr objectAtIndex:i];
            if (i == 4) {
                if ([[arr objectAtIndex:i] isEqualToString:@"已交車"]) {
                    label.textColor = [UIColor redColor];
                }else{
                    label.textColor = MainColor;
                }
            }
        }
        [cell.contentView addSubview:label];
    }
    return cell;
}
#pragma mark  【 UITableViewDelegate 】
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; {
    
    return showRowsHeight;
}

#pragma mark 【 UIScrollViewDelegate 】
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    
    NSLog(@"%f",self.MainScrollView.contentOffset.y);
    if (self.MainScrollView.contentOffset.y == (_dataArr.count * showRowsHeight - showRowsHeight * showRows)) {
        [self.MainScrollView setContentOffset:CGPointMake(0, 0) animated:NO];
    }
}

#pragma mark 【 Lazy Load 】
- (UIScrollView *)MainScrollView {
    
    if (!_MainScrollView) {
        _MainScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, showRowsHeight * showRows)];
        _MainScrollView.delegate = self;
        _MainScrollView.scrollEnabled = NO;
        [_MainScrollView addSubview:self.scrollTableView];
    }
    return _MainScrollView;
}

- (UITableView *)scrollTableView {
    
    if (!_scrollTableView) {
        _scrollTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, showRowsHeight * showRows) style:UITableViewStylePlain];
        _scrollTableView.dataSource = self;
        _scrollTableView.delegate = self;
        _scrollTableView.showsVerticalScrollIndicator = NO;
        _scrollTableView.showsHorizontalScrollIndicator = NO;
        _scrollTableView.scrollEnabled = NO;
    }
    return _scrollTableView;
}

- (void)removeTimer {
    
    [self.timer invalidate];
    self.timer = nil;
}

- (void)dealloc {
    
    [self.timer invalidate];
    self.timer = nil;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 概述在iOS開發(fā)中UITableView可以說是使用最廣泛的控件,我們平時使用的軟件中到處都可以看到它的影子,類似...
    liudhkk閱讀 9,299評論 3 38
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,405評論 4 61
  • iOS開發(fā)系列--網(wǎng)絡(luò)開發(fā) 概覽 大部分應(yīng)用程序都或多或少會牽扯到網(wǎng)絡(luò)開發(fā),例如說新浪微博、微信等,這些應(yīng)用本身可...
    lichengjin閱讀 4,040評論 2 7
  • (一) 重點(diǎn)提醒:人的格局高于所處位置,不一定是好事。或許從國際形勢、地方政策、企業(yè)戰(zhàn)略、管理科學(xué)角度你的做...
    我就是大怪獸閱讀 350評論 0 4
  • 開發(fā)angular是一件愉快的事情,雖然總會有人詬病,但那又如何。你玩的開心就行了,就像小嬰兒抓到一張也能玩的很嗨...
    葉糖糖閱讀 964評論 2 2

友情鏈接更多精彩內(nèi)容