美文网首页
跑马灯

跑马灯

作者: Coder东 | 来源:发表于2017-06-27 20:29 被阅读16次
    #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

相关文章

  • GitHub上受欢迎的Android UI Library(下)

    跑马灯 MarqueeView★1568 - 垂直翻页公告 MarqueeViewDemo★896 - 跑马灯Vi...

  • Android 基础 UI 之 TextView

    一、显示富文本 效果图image 布局文件 逻辑代码 二、跑马灯效果 1. 横向跑马灯 效果图: 单个实现跑马灯:...

  • textview - 跑马灯

    textview 的跑马灯不用说了吧,大家肯定都知道这是个啥,但是呢我还是放个图吧: 实现单个跑马灯 跑马灯的核心...

  • Kevin Learn Android:TextView

    一、显示富文本 效果图01.png 布局文件 逻辑代码 二、跑马灯效果 1. 横向跑马灯 效果图: 单个实现跑马灯...

  • TextView漏的知识点

    跑马灯效果

  • leetcode ascii码 汇总

    跑马灯效果

  • iOS 跑马灯的实现

    介绍 我们一说起跑马灯第一个想到的就是:山寨机。接下来介绍的跑马灯和那个跑马灯是不一样滴。在iOS中,跑马灯是指l...

  • Android实现跑马灯效果

    实现方式1 跑马灯相关属性 实现方式2:自定义跑马灯类 上面方式1能暂时实现跑马灯效果,但在多次点击事件之后容易失...

  • 流水灯(2016-04-03)

    跑马灯: 左右跑马灯(for循环后面不要加分号) 数码管依次显示0-9

  • flutter跑马灯

    flutter_marquee flutter 插件 flutter 跑马灯可以指定跑马灯的方向可以传入数组,可以...

网友评论

      本文标题: 跑马灯

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