(iOS)电商滚动广告标题

在我的开源商城项目的广告标题的滚动,在这里又简单的封装了一下,大致实现了三种格式的滚动类型:

效果截图
  • 实现方面,我利用UIView animateWithDuration结合CALayer的CATransform3D坐标变换做上下翻滚动画。

UIView animateWithDuration 就不做介绍了,简单介绍下CATransform3D以及两者相结合如果形成上下翻滚的立体动画的。

  • CATransform3D:在苹果的文档中它是定义在核心动画中使用的标准转换矩阵,用于旋转、缩放、转换、倾斜和投射图层内容。CATransform3D CATransform3DMakeRotation (CGFloat angle, CGFloat x, CGFloat y, CGFloat z);
angle:旋转的弧度,要把角度转换成弧度:角度 * M_PI / 180

x:向X轴方向旋转,值范围-1 — 1之间

y:向Y轴方向旋转,值范围-1 — 1之间

z:向Z轴方向旋转,值范围-1 — 1之间
  • 翻滚核心实现代码:
#pragma mark - 标题滚动
- (void)titleRolling{
    
    if (self.saveMiddleArray.count > 1) { //所存的每组滚动
        __weak typeof(self)weakSelf = self;
        
        [UIView animateWithDuration:self.rollingTime animations:^{
            
            [self getMiddleArrayWithIndex:0 WithAngle:- M_PI_2 Height:- RollingViewHeight / 2]; //第0组
            
            [self getMiddleArrayWithIndex:1 WithAngle:0 Height:0]; //第一组
            
        } completion:^(BOOL finished) {
            
            if (finished == YES) { //旋转结束
                UIButton *newMiddleView = [weakSelf getMiddleArrayWithIndex:0 WithAngle:M_PI_2 Height: -RollingViewHeight / 2];
                [weakSelf.saveMiddleArray addObject:newMiddleView];
                
                [weakSelf.saveMiddleArray removeObjectAtIndex:0];
            }
        }];
    }
    
}

#pragma mark - CATransform3D翻转
- (UIButton *)getMiddleArrayWithIndex:(NSInteger)index WithAngle:(CGFloat)angle Height:(CGFloat)height
{
    if (index > _saveMiddleArray.count) return 0;
    UIButton *middleView = self.saveMiddleArray[index];
    
    CATransform3D trans = CATransform3DIdentity;
    trans = CATransform3DMakeRotation(angle, 1, 0, 0);
    trans = CATransform3DTranslate(trans, 0, height, height);
    middleView.layer.transform = trans;
    
    return middleView;
}

  • 使用方式:导入头文件CDDTitleRolling

DCTitleRolling.h文件中可以发现我重写了自定义View的initFrame方法,通过新建TitleRolling对象对titleDataBlock中的参数进行可选赋值来完成

/**
 数据
 
 *leftImage 左边图片
 *rolTitles 标题数组
 *rolTags   tag数组
 *rightImages 右边图片数组
 *rightbuttonTitle 右边按钮(支持点击回调)
 *interval 定时器滚动间隔
 *rollingTime 滚动一次时间的长短
 *titleFont 标题尺寸
 *titleColor 标题颜色
 *isShowTagBorder 是否展示tag标题边框(默认不)
 @param frame 滚动标题的frame
 @param titleDataBlock 设置滚动内部的数据
 @return 数据展示
 */
- (instancetype)initWithFrame:(CGRect)frame WithTitleData:(void(^)(CDDRollingGroupStyle *rollingGroupStyle, NSString **leftImage,NSArray **rolTitles,NSArray **rolTags,NSArray **rightImages,NSString **rightbuttonTitle,NSInteger *interval,float *rollingTime,NSInteger *titleFont,UIColor **titleColor,BOOL *isShowTagBorder))titleDataBlock;

初始之外,我在.h中提供代理,回调和开始、结束方法等方法供使用选择

/** 点击代理 */
@property (nonatomic , assign) id<CDDRollingDelegate>delegate;
/** 更多点击回调 */
@property (nonatomic, copy) dispatch_block_t moreClickBlock;
/**
 开始滚动
 */
- (void)dc_beginRolling;

/**
 结束滚动
 */
- (void)dc_endRolling;

  • demo调用展示三种不同类型的电商标题滚动,GIF效果图

/* 京东头条 */
@property (strong , nonatomic)DCTitleRolling *jdRollingView;

/* 国美在线 */
@property (strong , nonatomic)DCTitleRolling *gmRollingView;

/* 淘宝 */
@property (strong , nonatomic)DCTitleRolling *tbRollingView;
#pragma mark - JD
- (void)setUpJDRolling {

    _jdRollingView = [[DCTitleRolling alloc] initWithFrame:CGRectMake(15, 100, self.view.frame.size.width - 30, 44) WithTitleData:^(CDDRollingGroupStyle *rollingGroupStyle, NSString *__autoreleasing *leftImage, NSArray *__autoreleasing *rolTitles, NSArray *__autoreleasing *rolTags, NSArray *__autoreleasing *rightImages, NSString *__autoreleasing *rightbuttonTitle, NSInteger *interval, float *rollingTime, NSInteger *titleFont, UIColor *__autoreleasing *titleColor, BOOL *isShowTagBorder) {
      
        *rollingTime = 0.2; //可选,默认为0.5
        *rolTags = @[@"HOT",@"HOT",@"",@"HOT"];
        *rolTitles = @[@"小丑女的拍照秘籍竟然是?",@"2000热门手机推荐",@"好奇么?点进去哈",@"这套家具比房子还贵"];
        *leftImage = @"shouye_img_toutiao";
        *rightbuttonTitle = @"更多"; 
        *interval = 3.0;
        *titleFont = 14;
        *titleColor = [UIColor darkGrayColor];
    }];
    
    _jdRollingView.moreClickBlock = ^{
        NSLog(@"jd----more");
    };
    
    [_jdRollingView dc_beginRolling];
    _jdRollingView.layer.cornerRadius = 15;
    [_jdRollingView.layer masksToBounds];
    _jdRollingView.backgroundColor = [UIColor whiteColor];
    [self.view addSubview:_jdRollingView];
}

#pragma mark - GM
- (void)setUpGMRolling
{
    _gmRollingView = [[DCTitleRolling alloc] initWithFrame:CGRectMake(0, 200, self.view.frame.size.width, 44) WithTitleData:^(CDDRollingGroupStyle *rollingGroupStyle, NSString *__autoreleasing *leftImage, NSArray *__autoreleasing *rolTitles, NSArray *__autoreleasing *rolTags, NSArray *__autoreleasing *rightImages, NSString *__autoreleasing *rightbuttonTitle, NSInteger *interval, float *rollingTime, NSInteger *titleFont, UIColor *__autoreleasing *titleColor, BOOL *isShowTagBorder) {
        
        *rolTags = @[@"object",@"github",@"java/php"];
        *rolTitles = @[@"DCTitleRolling 欢迎留言",@"喜欢的话可以给我点个Star✨✨",@"一门面向对象编程语言"];
        *leftImage = @"shouye_img_toutiao";
        *interval = 3.0;
        *titleFont = 14;
        *titleColor = [UIColor orangeColor];
        *isShowTagBorder = YES;
    }];
    _gmRollingView.delegate = self;
    [_gmRollingView dc_beginRolling];
    _gmRollingView.backgroundColor = [UIColor whiteColor];
    [self.view addSubview:_gmRollingView];
        

}

#pragma mark - TB
- (void)setUpTBRolling
{
    _tbRollingView = [[DCTitleRolling alloc] initWithFrame:CGRectMake(0, 300, self.view.frame.size.width, 60) WithTitleData:^(CDDRollingGroupStyle *rollingGroupStyle, NSString *__autoreleasing *leftImage, NSArray *__autoreleasing *rolTitles, NSArray *__autoreleasing *rolTags, NSArray *__autoreleasing *rightImages, NSString *__autoreleasing *rightbuttonTitle, NSInteger *interval, float *rollingTime, NSInteger *titleFont, UIColor *__autoreleasing *titleColor, BOOL *isShowTagBorder) {
        
        *rollingTime = 0.2;
        *rightImages = @[@"jshop_sign_layer_not",@"jshop_sign_layer_ok",@"jshop_sign_layer_not"];
        *rollingGroupStyle  = CDDRollingTwoGroup;
        *rolTags = @[@[@"热热",@"爆爆",@"红红"],@[@"冷知识",@"小常识",@"最新"]];
        *rolTitles = @[@[@"喜欢的给个Star",@"苹果X爆冷,黄牛都哭了",@"还在等什么,赶紧抢购"],@[@"有问题欢迎留言~~",@"IOS 11 升级bug出现",@"科技风云惊奇出现等等的等"]];
        *leftImage = @"topTitle";
        *interval = 4.0;
        *titleFont = 14;
        *titleColor = [UIColor blueColor];
        *isShowTagBorder = YES; //是否展示tag边框
        
    }];
    _tbRollingView.delegate = self;
    [_tbRollingView dc_beginRolling];
    _tbRollingView.backgroundColor = [UIColor whiteColor];
    [self.view addSubview:_tbRollingView];
}

代理协议:<CDDRollingDelegate>

#pragma mark - <CDDRollingDelegate>
- (void)dc_RollingViewSelectWithActionAtIndex:(NSInteger)index
{
    NSLog(@"点击了第%zd头条滚动条",index);
}
滚动gif.gif

如果想查看具体源码,请点击如下链接下载,如果问题和建议欢迎Issues

Demo上传地址:CDDTitleRolling

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

推荐阅读更多精彩内容

  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥ios动画全貌。在这里你可以看...
    每天刷两次牙阅读 8,321评论 6 30
  • 在iOS实际开发中常用的动画无非是以下四种:UIView动画,核心动画,帧动画,自定义转场动画。 1.UIView...
    请叫我周小帅阅读 3,000评论 1 23
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌。在这里你可以看...
    F麦子阅读 4,999评论 5 13
  • Core Animation Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,...
    45b645c5912e阅读 2,968评论 0 21
  • 花钱这件事上,却最能看出一个人的基本素质和心态。 基本素质:尊重彼此,愿意为彼此之间的关系花钱 心态:笼统的讲是乐...
    无路可循阅读 272评论 0 1