IOS 跑馬燈示例

#import <UIKit/UIKit.h>

@protocol MarqueeControlDelegate <NSObject>

//點擊跑馬燈回調(diào)方法
-(void)selectTitleForIndex:(int)index andTitle:(NSString*)title;

@end


@interface MarqueeControl : UIView

//內(nèi)容數(shù)組
@property(strong ,nonatomic)NSArray *titleArr;

//點擊回調(diào)
@property(assign ,nonatomic)id<MarqueeControlDelegate> delegate;

//初始化方法
-(instancetype)initWithFrame:(CGRect)frame andContent:(NSArray*)titleArr;

-(void)start;

-(void)stop;

//重新加載跑馬燈數(shù)據(jù)
-(void)resetMarqueeControlView:(NSArray*)titles;

@end

主要的思想就是跑馬燈的內(nèi)容展示在btn上篷牌,btn放入數(shù)組中援岩,然后修改坐標(biāo)X榜揖,動畫中實現(xiàn)左移效果沙绝,當(dāng)?shù)谝粋€btn移出視圖傍菇,那么第一個btn要放到最后距淫,數(shù)組中也是從第一個刪除污朽,加到最后

#import "MarqueeControl.h"


#define SCREEN_WIDTH ([UIScreen mainScreen].bounds.size.width)

//字體大小
#define WORD_FONT 17
//動畫時間
#define ANIMATE_TIME 0.05
//動畫延時時間
#define ANIMATE_DELAY 0
//每條信息間隔距離
#define BUTTON_SPACING 20

#define BUTTON_TAG 100

@interface MarqueeControl()

//裝載內(nèi)容按鈕數(shù)組
@property (strong ,nonatomic)NSMutableArray *titleBtnArr;
//是否在滾動
@property (assign ,nonatomic)BOOL revolve;

@end

@implementation MarqueeControl

//無數(shù)據(jù)初始化方法
-(instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self initData];
    }
    return self;
}

//有數(shù)據(jù)初始化方法
-(instancetype)initWithFrame:(CGRect)frame andContent:(NSArray*)titleArr
{
    self = [super initWithFrame:frame];
    
    if (self) {
        [self initData];
        if (titleArr) {
            self.titleArr = titleArr;
            [self layoutContentView];
        }
    }
    return self;
}

//初始化滾動數(shù)據(jù)
-(void)initData{
    //這句話的意思就是說傲诵,內(nèi)容是不是只在本視圖展示髓介,移出界面是否還展示
    self.clipsToBounds = YES;
    self.titleBtnArr = [[NSMutableArray alloc]init];
    self.revolve = NO;
}

//布局界面
#pragma mark -布局
-(void)layoutContentView
{
    //利用UILabel的sizeToFit方法惕鼓,得到文字長度
    UILabel *tempLabel = [UILabel new];
    tempLabel.font = [UIFont boldSystemFontOfSize:WORD_FONT];
    for(int i=0;i<self.titleArr.count;i++)
    {
        NSString *title = self.titleArr[i];
        tempLabel.text = title;
        [tempLabel sizeToFit];
        
        //每一條內(nèi)容都是一個button展示
        UIButton *titleBtn = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 0, 0)];;
        titleBtn.titleLabel.font = [UIFont boldSystemFontOfSize:WORD_FONT];
        titleBtn.titleLabel.textAlignment = NSTextAlignmentCenter;
        titleBtn.tag = BUTTON_TAG+i;
        
        [titleBtn addTarget:self action:@selector(titleBtnClick:) forControlEvents:UIControlEventTouchUpInside];
        
        if (self.titleArr.count>0 && i > 0) {
            
            UIButton *btn = self.titleBtnArr[i-1];
            
            //btn的frame.x由前個按鈕的坐標(biāo)+間隔,長度由label提供
            titleBtn.frame = CGRectMake(btn.frame.origin.x+btn.frame.size.width, 0, tempLabel.frame.size.width+BUTTON_SPACING, self.frame.size.height);
            
        }else{
            如果是第一個按鈕,就不需要它之前的按鈕坐標(biāo)判斷位置了
            titleBtn.frame = CGRectMake(0, 0, tempLabel.frame.size.width+BUTTON_SPACING, self.frame.size.height);
        }
        
        [titleBtn setTitle:title forState:UIControlStateNormal];
        [titleBtn setTitleColor:UIColorFromRGB(0x333333) forState:UIControlStateNormal];
        titleBtn.titleLabel.font = [UIFont boldSystemFontOfSize:WORD_FONT];
      //添加到頁面上
        [self addSubview:titleBtn];
     //添加到數(shù)組中
        [self.titleBtnArr addObject:titleBtn];
    }
}

//重新加載滾動內(nèi)容
-(void)resetMarqueeControlView:(NSArray*)titles
{
    //先暫停動畫
    [self stop];
   
    //刪除按鈕 
    for(UIButton *btn in self.titleBtnArr)
    {
        [btn removeFromSuperview];
        [btn.layer removeAllAnimations];
    }
    
    [self.titleBtnArr removeAllObjects];
    
    //重新加載數(shù)據(jù)
    if (titles) {
        self.titleArr = titles;
        [self layoutContentView];
    }

}

#pragma mark -操作跑馬燈事件

//開始動畫
-(void)start
{
    if (!self.revolve) {
        self.revolve = YES;
        [self startRevolve];
    }
    
}

//停止動畫
-(void)stop{
    self.revolve = NO;
}


-(void)startRevolve
{

    //UIViewAnimationOptionAllowUserInteraction在動畫過程中唐础,允許點擊交互
    [UIView animateWithDuration:ANIMATE_TIME delay:ANIMATE_DELAY options:UIViewAnimationOptionAllowUserInteraction|UIViewAnimationOptionCurveLinear animations:^{
        //執(zhí)行動畫,數(shù)組中的所有按鈕frame.x坐標(biāo)往左移動每次-1
        for (UIButton *btn in self.titleBtnArr) {
            CGRect frame = btn.frame;
            frame = CGRectMake(frame.origin.x-1, frame.origin.y, frame.size.width, frame.size.height);
            btn.frame = frame;
        }
        
    } completion:^(BOOL finished) {
        //取第一個按鈕
        UIButton *btn = self.titleBtnArr[0];
        //取最后一個按鈕
        UIButton *lastBtn = self.titleBtnArr[self.titleBtnArr.count-1];

        CGRect frame = btn.frame;
        //判斷數(shù)組中的第一個按鈕像左移動箱歧,是不是已經(jīng)移出視圖中
        if (frame.size.width + frame.origin.x<0) {
            //如果最后一個按鈕x+width小于當(dāng)前視圖寬度
            if (lastBtn.frame.origin.x+lastBtn.frame.size.width<self.frame.size.width) {
                //第一個按鈕的坐標(biāo)要放到視圖的最右邊,然后慢慢左移滑入
                frame = CGRectMake(self.frame.size.width, frame.origin.y, frame.size.width, frame.size.height);
            }else{
                //第一個按鈕的坐標(biāo)排在最后一個按鈕的后面一膨,慢慢左移滑入
                frame = CGRectMake(lastBtn.frame.origin.x+lastBtn.frame.size.width, frame.origin.y, frame.size.width, frame.size.height);
            }
            //數(shù)組中刪除第一個按鈕
            [self.titleBtnArr removeObjectAtIndex:0];
            btn.frame = frame;
            //按鈕加到最后面叫胁,也就是說第一個按鈕,左移出了界面汞幢,就要放到界面的最后
            [self.titleBtnArr addObject:btn];
        }
      //判斷是否繼續(xù)滾動了
        if(self.revolve){
            
            [self startRevolve];
            
        }
    }];
}

#pragma mark -代理回調(diào)
-(void)titleBtnClick:(UIButton*)sender
{
    int index =(int)sender.tag-BUTTON_TAG;
    
    [self.delegate selectTitleForIndex:index andTitle:self.titleArr[index]];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末驼鹅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子森篷,更是在濱河造成了極大的恐慌输钩,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仲智,死亡現(xiàn)場離奇詭異买乃,居然都是意外死亡,警方通過查閱死者的電腦和手機钓辆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進(jìn)店門剪验,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肴焊,“玉大人,你說我怎么就攤上這事功戚∪⒕欤” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵啸臀,是天一觀的道長届宠。 經(jīng)常有香客問我,道長乘粒,這世上最難降的妖魔是什么豌注? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮灯萍,結(jié)果婚禮上轧铁,老公的妹妹穿的比我還像新娘。我一直安慰自己旦棉,他們只是感情好属桦,可當(dāng)我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著他爸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪果善。 梳的紋絲不亂的頭發(fā)上诊笤,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機與錄音巾陕,去河邊找鬼讨跟。 笑死,一個胖子當(dāng)著我的面吹牛鄙煤,可吹牛的內(nèi)容都是我干的晾匠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼梯刚,長吁一口氣:“原來是場噩夢啊……” “哼凉馆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起亡资,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤澜共,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后锥腻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嗦董,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年瘦黑,在試婚紗的時候發(fā)現(xiàn)自己被綠了京革。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奇唤。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖匹摇,靈堂內(nèi)的尸體忽然破棺而出咬扇,到底是詐尸還是另有隱情,我是刑警寧澤来惧,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布冗栗,位于F島的核電站,受9級特大地震影響供搀,放射性物質(zhì)發(fā)生泄漏隅居。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一葛虐、第九天 我趴在偏房一處隱蔽的房頂上張望胎源。 院中可真熱鬧,春花似錦屿脐、人聲如沸涕蚤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽万栅。三九已至,卻和暖如春西疤,著一層夾襖步出監(jiān)牢的瞬間烦粒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工代赁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留扰她,地道東北人。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓芭碍,卻偏偏與公主長得像徒役,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子窖壕,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,630評論 2 359

推薦閱讀更多精彩內(nèi)容