跑马灯

    #import <UIKit/UIKit.h>
    @class AdvertisementView;
    typedef void(^CloseBtnClick) (AdvertisementView *view);
    typedef void(^DidSelectItem) (NSIndexPath *indexPath,NSString *tipString);

    @interface AdvertisementView : UIView

    @property (nonatomic, copy) CloseBtnClick closeBtnClick;
    @property (nonatomic, copy) DidSelectItem selectItemBlock;

      /**
     广告位提示文字数组
     */

    @property (nonatomic, strong) NSArray *tipStrArr;

    /**
     每段广告之间的距离
     */
    @property (nonatomic, assign) CGFloat tipDistance;

    @end



    #import "AdvertisementView.h"
    #import "TitleTipCell.h"
    #define MaxCount 2
    #define MDK_SCREEN_WIDTH  [[UIScreen mainScreen] bounds].size.width
    /**
     *  整个屏幕高度
     */
    #define MDK_SCREEN_HEIGHT [[UIScreen mainScreen] bounds].size.height

    #define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]


    @interface AdvertisementView()<UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout>
    {
        NSTimer *timer;
        CGFloat currentWidth;
        NSInteger numberOfItems;//需要返回的item的个数
    }

    @property (nonatomic,strong) UICollectionView *collectionView;

    @end


    @implementation AdvertisementView

    -(instancetype)initWithFrame:(CGRect)frame{

self = [super initWithFrame:frame];
if (self) {
    
    self.backgroundColor = UIColorFromRGB(0xf0faf6);
    [self createSubViews];
}
return self;
    }
    /*
     创建子视图
     */
      -(void)createSubViews{
UIImageView *leftImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 44, 44)];
leftImage.backgroundColor = [UIColor clearColor];
leftImage.image = [UIImage imageNamed:@"ggl_lb_icon"];
[self addSubview:leftImage];

UIButton *rightBtn = [UIButton buttonWithType:UIButtonTypeCustom];
rightBtn.backgroundColor = [UIColor clearColor];
rightBtn.frame = CGRectMake(MDK_SCREEN_WIDTH-44, 0, 44, 44);
[rightBtn setImage:[UIImage imageNamed:@"ggl_x_close"] forState:UIControlStateNormal];
[rightBtn addTarget:self
             action:@selector(closeBtnClickAction)
   forControlEvents:UIControlEventTouchUpInside];
[self addSubview:rightBtn];

[self addSubview:self.collectionView];
    }
      /**
     懒加载
     */

    -(UICollectionView *)collectionView {

if (_collectionView == nil) {
    UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc]init];
    //左右间距
    flowLayout.minimumInteritemSpacing = 0;
    //行间距
    flowLayout.minimumLineSpacing = 0;//设置为0不设置则有默认行间距
    flowLayout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
    
    _collectionView = [[UICollectionView alloc]initWithFrame:CGRectMake(44, 0, MDK_SCREEN_WIDTH - 88, 44) collectionViewLayout:flowLayout];
    _collectionView.backgroundColor = [UIColor clearColor];
    _collectionView.delegate = self;
    _collectionView.dataSource = self;
    _collectionView.showsHorizontalScrollIndicator = NO;
    _collectionView.scrollEnabled = NO;
    [_collectionView registerClass:[TitleTipCell class] forCellWithReuseIdentifier:@"cell"];
    
}
return _collectionView;
    }

    -(void)setTipStrArr:(NSArray *)tipStrArr{
_tipStrArr = tipStrArr;

[self addTimer];
[self.collectionView reloadData];
    }
    #pragma mark --- NSTimer --
    /**
   添加定时器
     */
    -(void)addTimer{

timer = [NSTimer scheduledTimerWithTimeInterval:0.002 target:self selector:@selector(scrollCollectionView) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop]addTimer:timer forMode:NSRunLoopCommonModes];

    }
  /**
   移除定时器
 */
-(void)removeTimer{
if (timer.isValid) {
    [timer invalidate];
    timer = nil;
}
}

//FIXME: MARK -- scrollCollectionView --
-(void)scrollCollectionView{

CGFloat x = self.collectionView.contentOffset.x;
NSLog(@"x---%f",x);
//意思是内容大于CollectionView的宽度的时候,偏移量就增加1
//当x小于偏移的宽度
if (x < (self.collectionView.contentSize.width -MDK_SCREEN_WIDTH + 87)) {
    self.collectionView.contentOffset = CGPointMake(x+1, 0);
    
    NSLog(@"self.collectionView.width--%f---%f",self.collectionView.contentSize.width,(self.collectionView.contentSize.width -MDK_SCREEN_WIDTH + 87));
    NSLog(@"offset--11--%f--%@",self.collectionView.contentSize.width-MDK_SCREEN_WIDTH+87-x,NSStringFromCGPoint(self.collectionView.contentOffset));
}else{
    CGFloat scroll_x = [self getTipArrInfomationWidth] - MDK_SCREEN_WIDTH + 88 ;
    self.collectionView.contentOffset = CGPointMake(scroll_x, 0);
    
    NSLog(@"offset--22--%f",self.collectionView.contentSize.width-MDK_SCREEN_WIDTH+87-x);
}
}

//TODO: MARK -- getTipArrInfomationWidth --

-(CGFloat)getTipArrInfomationWidth{

__block CGFloat totalWidth = 0;
[self.tipStrArr enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
   
    CGFloat celWidth = [obj boundingRectWithSize:CGSizeMake(1000, 44) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingTruncatesLastVisibleLine attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:14]} context:nil].size.width + self.tipDistance;
    
    totalWidth = totalWidth + celWidth;
}];

return totalWidth;
}

#pragma mark - UICollectionViewDataSource
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return self.tipStrArr.count*MaxCount;
}

- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
TitleTipCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
NSInteger tipCount = self.tipStrArr.count;
NSString *tipString = self.tipStrArr[indexPath.row%tipCount];
cell.name.text = tipString;
cell.name.frame = CGRectMake(0, 0, [self getCellWidthWithIndexPath:indexPath], 44);
return cell;
}
#pragma Mark-- UICollectionViewDelegateFlowLayout
-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{

return CGSizeMake([self getCellWidthWithIndexPath:indexPath], 44);

}
-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{
NSInteger tipCount = self.tipStrArr.count;
NSString *tipString = self.tipStrArr[indexPath.row%tipCount];
if (self.selectItemBlock)
{
    self.selectItemBlock(indexPath,tipString);
}

}
/**
 返回某一个item的宽度

 @param indexPath indexPath
 @return 对应item的宽度
 */
- (CGFloat)getCellWidthWithIndexPath:(NSIndexPath *)indexPath
{
//tipStrArr 广告位提示文字数组
NSInteger tipCount = self.tipStrArr.count;
//这样求余的结果是所有的的内容就会轮番显示
NSString *tipString = self.tipStrArr[indexPath.row % tipCount];

CGFloat cellWith = [tipString boundingRectWithSize:CGSizeMake(1000, 44) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading|NSStringDrawingTruncatesLastVisibleLine attributes:@{NSFontAttributeName :[UIFont systemFontOfSize:16.]} context:nil].size.width+self.tipDistance;

return cellWith;

}

#pragma mark - actions

- (void)closeBtnClickAction
{
[self removeTimer];

if (self.closeBtnClick)
{
    self.closeBtnClick(self);
}

}

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

推荐阅读更多精彩内容