iOS实现文字水平无间断滚动效果

IOS跑马灯效果,实现文字水平无间断滚动,示例代码如下:

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController{
  NSTimer      *timer;
  UIScrollView   *scrollViewText;
}

@property (nonatomic ,strong) NSArray *arrData;

@end

ViewController.m

//
// ViewController.m
// 滚动
//
#import "ViewController.h"

#pragma mark - Class define variable
#define K_MAIN_VIEW_SCROLL_HEIGHT 80.0f
#define K_MAIN_VIEW_SCROLL_TEXT_TAG 300
#define K_MAIN_VIEW_TEME_INTERVAL 0.35        //计时器间隔时间(单位秒)
#define K_MAIN_VIEW_SCROLLER_SPACE 20.0f       //每次移动的距离
#define K_MAIN_VIEW_SCROLLER_LABLE_WIDTH   18.0f  //单个字符宽度(与你设置的字体大小一致)
#define K_MAIN_VIEW_SCROLLER_LABLE_MARGIN  20.0f  //前后间隔距离
#define K_MAIN_VIEW_SCROLLER_SLEEP_INTERVAL 1    //停留时间

@interface ViewController ()

@end

@implementation ViewController

#pragma mark - Class property
@synthesize arrData;

- (void)viewDidLoad {
  [super viewDidLoad];

  [self initView];
}

- (void)didReceiveMemoryWarning {
  [super didReceiveMemoryWarning];
  // Dispose of any resources that can be recreated.
}

#pragma mark - Custom method
//初始化数据
-(void) initView{

  if (!self.arrData) {
    self.arrData = @[
             @{
               @"newsId"  :@"201507070942261935",
               @"newsImg" :@"http://bg.fx678.com/HTMgr/upload/UpFiles/20150707/sy_2015070709395519.jpg",
               @"newsTitle":@"三大理由欧元任性抗跌,欧元区峰会将为希腊定调"
             },
             @{
               @"newsId"  :@"201507070929021220",
               @"newsImg"  :@"http://bg.fx678.com/HTMgr/upload/UpFiles/20150707/sy_2015070709273545.jpg",
               @"newsTitle" :@"欧盟峰会或现希腊转机,黄金打响1162保卫战"
             },
             @{
               @"newsId"  :@"201507070656471857",
               @"newsImg"  :@"http://bg.fx678.com/HTMgr/upload/UpFiles/20150707/2015070706533134.jpg",
               @"newsTitle" :@"希腊困局欧元不怕,油价服软暴跌8%"
             }
           ];
  }

  //文字滚动
  [self initScrollText];

  //开启滚动
  [self startScroll];

}

//文字滚动初始化
-(void) initScrollText{

  //获取滚动条
  scrollViewText = (UIScrollView *)[self.view viewWithTag:K_MAIN_VIEW_SCROLL_TEXT_TAG];
  if(!scrollViewText){
    scrollViewText = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 80, self.view.frame.size.width, K_MAIN_VIEW_SCROLL_HEIGHT)];
    scrollViewText.showsHorizontalScrollIndicator = NO;  //隐藏水平滚动条
    scrollViewText.showsVerticalScrollIndicator = NO;   //隐藏垂直滚动条
    scrollViewText.scrollEnabled = NO;          //禁用手动滑动

    //横竖屏自适应
    scrollViewText.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    scrollViewText.tag = K_MAIN_VIEW_SCROLL_TEXT_TAG;
    [scrollViewText setBackgroundColor:[UIColor grayColor]];

    //给滚动视图添加事件
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(scrollerViewClick:)];
    [scrollViewText addGestureRecognizer:tapGesture];

    //添加到当前视图
    [self.view addSubview:scrollViewText];
  }else{
    //清除子控件
    for (UIView *view in [scrollViewText subviews]) {
      [view removeFromSuperview];
    }
  }

  if (self.arrData) {

    CGFloat offsetX = 0 ,i = 0, h = 30;

    //设置滚动文字
    UIButton *btnText = nil;
    NSString *strTitle = [[NSString alloc] init];

    for (NSDictionary *dicTemp in self.arrData) {

      strTitle = dicTemp[@"newsTitle"];

      btnText = [UIButton buttonWithType:UIButtonTypeCustom];
      [btnText setFrame:CGRectMake([self getTitleLeft:i],
                     (K_MAIN_VIEW_SCROLL_HEIGHT - h) / 2,
                     strTitle.length * K_MAIN_VIEW_SCROLLER_LABLE_WIDTH,
                     h)];

      [btnText setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
      [btnText setTitle:strTitle forState:UIControlStateNormal];

      //横竖屏自适应
      btnText.autoresizingMask = UIViewAutoresizingFlexibleWidth;
      offsetX += btnText.frame.origin.x;

      //设置为 NO,否则无法响应点击事件
      btnText.userInteractionEnabled = NO;

      //添加到滚动视图
      [scrollViewText addSubview:btnText];

      i++;
    }

    //设置滚动区域大小
    [scrollViewText setContentSize:CGSizeMake(offsetX, 0)];
  }
}

#pragma mark - 滚动处理
//开始滚动
-(void) startScroll{

  if (!timer)
    timer = [NSTimer scheduledTimerWithTimeInterval:K_MAIN_VIEW_TEME_INTERVAL target:self selector:@selector(setScrollText) userInfo:nil repeats:YES];

  [timer fire];

}

//滚动处理
-(void) setScrollText{

  [UIView animateWithDuration:K_MAIN_VIEW_TEME_INTERVAL * 2 animations:^{
    CGRect rect;
    CGFloat offsetX = 0.0,width = 0.0;

    for (UIButton *btnText in scrollViewText.subviews) {

      rect = btnText.frame;
      offsetX = rect.origin.x - K_MAIN_VIEW_SCROLLER_SPACE;
      width = [btnText.titleLabel.text length] * K_MAIN_VIEW_SCROLLER_LABLE_WIDTH;

      btnText.frame = CGRectMake(offsetX, rect.origin.y, rect.size.width, rect.size.height);

      NSLog(@"offsetX:%f",offsetX);
    }

    if (offsetX < -width){
      [UIView setAnimationsEnabled:NO];
      [self initScrollText];
    }else
      [UIView setAnimationsEnabled:YES];
  }];

}

#pragma mark - 动态获取左边位置
-(float) getTitleLeft:(CGFloat) i {
  float left = i * K_MAIN_VIEW_SCROLLER_LABLE_MARGIN;

  if (i > 0) {
    for (int j = 0; j < i; j ++) {
      left += [[self.arrData objectAtIndex:j][@"newsTitle"] length] * K_MAIN_VIEW_SCROLLER_LABLE_WIDTH;
    }
  }

  return left;
}

#pragma mark - 新闻点击事件
-(void)btnNewsClick:(UIButton *) sender{

  NSString *strNewsTitle = sender.titleLabel.text;

  UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"系统提示"
                          message:strNewsTitle
                          delegate:sender
                     cancelButtonTitle:@"确定"
                     otherButtonTitles:@"其他", nil];
  [alert show];

}

-(void)scrollerViewClick:(UITapGestureRecognizer*)gesture{

  CGPoint touchPoint = [gesture locationInView:scrollViewText];

  for (UIButton *btn in scrollViewText.subviews) {

    if ([btn.layer.presentationLayer hitTest:touchPoint]) {
      [self btnNewsClick:btn];
      break;
    }

  }

}

@end 

示例源码下载:文字水平无间断滚动效果

备注:该开发工具XCode 版本为 6.4,如无法直接运行,可新建项目将以上文件复制替换即可

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • iOS利用UIScrollView实现无限滚动效果

    前言 众所周知UIScrollView 的无限滚动主要应用在图片轮播器.欢迎界面等场景.它的原理是在要显示的图片前后各加一张图片即在第一张图片之前放最后一张图片,在最后一张图片之后放第一张图片,然后在滚动到边缘的时候,巧妙的过渡一下就可以"瞒天过海","以假乱真"的造成无限滚动的假象.网络上有很多只用三张或两张图片实现的方法,效率比这个方法高,但实现起来稍微麻烦一点,有兴趣的可以去深入研究. 实现步骤 1.根据需求准备几张图片,在网上找了5张图片,分别命名为 img

  • iOS使用UICollectionView实现横向滚动照片效果

    本文实例为大家分享了iOS使用UICollectionView实现横向滚动展示照片的具体代码,供大家参考,具体内容如下 这是Demo链接 效果图 思路 1. 界面搭建 界面的搭建十分简单,采用UICollectionView和自定义cell进行搭建即可. // ViewController.m // 下面使用到的宏和全局变量 #define ScreenW [UIScreen mainScreen].bounds.size.width #define ScreenH [UIScreen main

  • iOS实现滚动字幕的动画特效

    效果图 开始上代码 滚动字幕的原理是用timer定时器间隔一定的时间来驱动scrollView上的内容偏移,来实现滚动的效果,原理比较简单,关键是有些细节需要处理好,实现流畅效果的同时要考虑到性能优化 这里是.h文件的接口方法及属性,可适应大部分自定义场景 /*初始化*/ -(instancetype)initWithFrame:(CGRect)frame textArray:(NSArray *)textArray colorArray:(NSArray *)textColorArray; /

  • IOS中无限滚动Scrollview效果

    本文实例讲了IOS无限滚动效果,分享给大家供大家参考,具体内容如下 滑动到当前位置时候才去请求,本地有内容则直接显示(以来SDWebImage,UIView+Ext) HZScrollView.h #import <UIKit/UIKit.h> typedef void(^HZReturnBlock)(NSInteger index,CGFloat offset); typedef NS_ENUM(NSUInteger, HZScrollViewPageControllPosition) {

  • 使用Swift实现iOScollectionView广告无限滚动效果(DEMO)

    今天公司里的实习生跑过来问我一般App上广告的无限滚动是怎么实现的,刚好很久没写博客了,就决定写下了,尽量帮助那些处于刚学iOS的程序猿. 做一个小demo,大概实现效果如下图所示: 基本实现思路: 1. 在你需要放置无限滚动展示数据的地方把他的数据,在原本的基础上把你要展示的数据扩大三倍.(当然扩大两倍也是可以的,三倍的话,比较好演示) // MARK: - 设置数据源 func collectionView(_ collectionView: UICollectionView, number

  • iOS仿网易简单头部滚动效果

    本文实例为大家分享了iOS仿网易滚动效果片展示的具体代码,供大家参考,具体内容如下 仿网易的主要思想为: 1. 设置好按钮与线的宽度, 2. 将所需要的标题传入并生成按钮 3. 在点击的时候,通过计算偏移量,将自身进行偏移 4. 偏移量的设置需要注意不能小于0并且不成大于contengsize-frame的宽度 具体代码如下,可直接使用,需要注意的是需要先设置宽度,再传标题数组才可自动调整,否则会固定为默认的60 另外,BtnArr与linelabel设置为readonly比较合理,不过这里还需

  • iOS实现无限循环滚动的TableView实战教程

    前言 本文主要给大家介绍了如何实现一个可以无限循环的TableView的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍吧. 先来看看效果: 思路 条条大路通罗马,个人分析下以下思路的可行性: 1.借鉴无限广告轮播的思路.可行性不高,主要是列表头部和尾部的衔接不够自然,而且快速滑动不够流畅. 2.使用TableView+3倍长度dataSource.可行性一般,在使用过程中滑动流畅,但是由于重复的数据源,可能导致在处理事件时需要特别对数据进行处理避免重复,另外此方法不能重用,总让有强迫

  • IOS上iframe的滚动条失效的解决办法

    问题描述: iframe设置了高度(例如500px).倘若iframe的内容足够长超出了iframe设定的高度时,在ipad等设备上.iframe内部html的滚动条不出现.并且活生生的从500px处截断,(类似overflow:hidden的效果)下面的内容不再显示. 问题重现: 结构: index.html : <style> #iframe{height:500px;} </style> <div id="content"> <ifram

  • iOS中无限循环滚动简单处理实现原理分析

    说下原理: 1./*初始化/ + (instancetype)loopScrollViewWithFrame:(CGRect)frame; 将背景collectinview视图初始化设置 代理和数据源 . 布局 2.在激活initwithFrame后触发 layoutSubviews //默认滚动到要显示的第一张图片 if (self.imageCollectionView.contentOffset.x == 0) { NSIndexPath *indexPath = [NSIndexPath

  • iOS仿网易新闻滚动导航条效果

    本文实例为大家分享了iOS滚动导航条效果展示的具体代码,供大家参考,具体内容如下 实现效果 效果:选择不同的栏目,下面出现不同的视图,栏目条可以滚动:下面的视图也可以滚动,滚动时上面对应的栏目要选中颜色为红色: 滚动的导航条包括两部分:标题滚动视图(UIScrollView),内容滚动视图(UIScrollView) 实现代码 1.首先实现Main.storyboard 2.创建多个子控制器:头条.科技.汽车.体育.视频.图片.热点 // 头条ViewController, 其它控制器和这个控制

随机推荐