UIScrollView - 圖片輪播器(完整代碼)

效果圖

UIScrollView - 圖片輪播.gif

#import "ViewController.h"

@interface ViewController ()<UIScrollViewDelegate>
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView; 
@property (weak, nonatomic) IBOutlet UIPageControl *pageControl;//分頁指示器
@property (assign, nonatomic) int pageNo; //分頁碼 scrollOffset
@property(nonatomic) int  pageSum;// 總頁數(shù)
@property (assign, nonatomic) CGFloat scrollMaxX; //scrollView最大x軸寬度
@property (assign, nonatomic) CGFloat scrollVisibleW;//scrollView可視區(qū)寬度
@property (assign, nonatomic) CGPoint scrollOffset;//scrollView的偏移量
@property (strong, nonatomic) NSTimer * timerImgScroll;//圖片輪播定時(shí)器
@end


@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    UIImage *imageTemp;
    UIImageView *imgViewText;
    
    self.pageSum = 5;// 總頁數(shù)
    CGFloat imgViewY = 0;
    CGFloat imgViewW = 375;
    CGFloat imgViewH = 260;
    
    for (int i=0; i<5; i++) {
        NSString *imgName = [NSString stringWithFormat:@"img_%02d",i+1];
        imageTemp = [UIImage imageNamed:imgName];
        imgViewText = [[UIImageView alloc]initWithImage:imageTemp];
        imgViewText.frame = CGRectMake(i*imgViewW, imgViewY, imgViewW, imgViewH);
        [self.scrollView addSubview:imgViewText];
    }
    //CGFloat imgViewMaxX = CGRectGetMaxX(imgViewText.frame);
    self.scrollMaxX = CGRectGetMaxX(imgViewText.frame);

    //告訴scrollView內(nèi)容有多大
    self.scrollView.contentSize = CGSizeMake(self.scrollMaxX, 0);
    //不顯示水平方向的滾動條
    self.scrollView.showsHorizontalScrollIndicator = NO;
    
    /*
     啟用分頁控件
        scrollView是以多少寬度,進(jìn)行分頁得?
        答:以scrollView自身的寬度為一頁,進(jìn)行分頁得!
     */
    self.scrollView.pagingEnabled = YES;
    
    /*
     PageControl
     Tint Color (其它顏色) Current Color(現(xiàn)在顏色)
     numberOfPages (總共多少頁) currentPage(現(xiàn)在是第幾頁)
     */
    self.pageControl.numberOfPages = self.pageSum;
    
    
    //設(shè)置代理對象
    self.scrollView.delegate = self;
    //設(shè)置scrollView可視區(qū)域的寬度
    CGSize imgViewSize = self.scrollView.frame.size;
    self.scrollVisibleW = imgViewSize.width;

    /*
     第一種方法
     NSTimeInterval 每隔多少時(shí)間
     target:  調(diào)用一次X的
     selector: XX方法
     userInfo: 發(fā)送XX消息
     repeats: 是否重復(fù)
     */
    self.timerImgScroll = [NSTimer scheduledTimerWithTimeInterval: 2.0 target:self selector: @selector(autoImgScoll) userInfo:nil repeats:YES];
    //獲取當(dāng)前運(yùn)行的線程,將’計(jì)時(shí)器’添加到當(dāng)前線程,調(diào)整當(dāng)前線程的優(yōu)先等級
    NSRunLoop *currentLoop = [NSRunLoop currentRunLoop];
    [currentLoop addTimer:self.timerImgScroll forMode:NSRunLoopCommonModes];
}

//自動實(shí)現(xiàn)輪播
-(void)autoImgScoll{
    self.pageNo ++;
    if(self.pageNo >= self.pageSum){
        self.pageNo = 0;
    }
    CGFloat  offsetScroll = (CGFloat)self.pageNo * self.scrollVisibleW;
    self.scrollView.contentOffset = CGPointMake(offsetScroll, 0);
}

/*
 開始拖動,(計(jì)時(shí)器銷毀)
 */
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
    NSLog(@"計(jì)時(shí)器銷毀...");
    [self.timerImgScroll invalidate];
}

/*
 結(jié)束拖動
 */
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
    NSLog(@"開啟timerBlock計(jì)時(shí)器...");
    /*
     第二種,使用block方式
     當(dāng)前的頁數(shù)*scrollView可視寬度 = 需要移動的偏移量
     timer - block:滿足block里面的條件,方執(zhí)行timer! 不滿足則不執(zhí)行timer
     */
    self.timerImgScroll = [NSTimer scheduledTimerWithTimeInterval:2.0 repeats:YES block:^(NSTimer * _Nonnull timer) {
        self.pageNo++;
        if (self.pageNo >= self.pageSum) {
            self.pageNo = 0;
        }
        CGFloat  offsetScroll = (CGFloat)self.pageNo * self.scrollVisibleW;
        self.scrollView.contentOffset = CGPointMake(offsetScroll, 0);
    }];
    
    //獲取當(dāng)前運(yùn)行的線程,將’計(jì)時(shí)器’添加到當(dāng)前線程,調(diào)整當(dāng)前線程的優(yōu)先等級
    NSRunLoop *currentLoop = [NSRunLoop currentRunLoop];
    [currentLoop addTimer:self.timerImgScroll forMode:NSRunLoopCommonModes];
}

/*
 監(jiān)聽滾動事件
 通過偏移量,來計(jì)算出滾動到某個(gè)寬度,則PageControl跳轉(zhuǎn)到下一個(gè)
    計(jì)算公式: (滾動的偏移量 + 每頁寬度*0.5)/每頁的寬度 = 第幾頁
    計(jì)算公式: 滾動的偏移量/每頁的寬度 + 0.5 = 第幾頁
 */
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    
    NSLog(@"%@",NSStringFromCGPoint(self.scrollView.contentOffset));
    //獲取滾動時(shí)的偏移量
    self.scrollOffset = self.scrollView.contentOffset;
    
    //self.pageNo = scrollOffset.x/self.scrollVisibleW;
    
    //最初方法沒有*0.5,這樣如果將圖片滾動到中間位置,pageControl不會改變?yōu)橄乱豁?就是那個(gè)點(diǎn),不會改變)!
    //self.pageNo = self.scrollOffset.x /self.scrollVisibleW;
    self.pageNo = (self.scrollOffset.x + self.scrollVisibleW *0.5)/self.scrollVisibleW;
    self.pageControl.currentPage = self.pageNo;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}
@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子摧茴,更是在濱河造成了極大的恐慌机久,老刑警劉巖浮驳,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坊秸,死亡現(xiàn)場離奇詭異踱蠢,居然都是意外死亡袖肥,警方通過查閱死者的電腦和手機(jī)咪辱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來椎组,“玉大人油狂,你說我怎么就攤上這事。” “怎么了专筷?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵弱贼,是天一觀的道長。 經(jīng)常有香客問我磷蛹,道長吮旅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任味咳,我火速辦了婚禮庇勃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘槽驶。我一直安慰自己责嚷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布掂铐。 她就那樣靜靜地躺著罕拂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪全陨。 梳的紋絲不亂的頭發(fā)上爆班,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天,我揣著相機(jī)與錄音辱姨,去河邊找鬼柿菩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛炮叶,可吹牛的內(nèi)容都是我干的碗旅。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼镜悉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了医瘫?” 一聲冷哼從身側(cè)響起侣肄,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎醇份,沒想到半個(gè)月后稼锅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡僚纷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年矩距,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怖竭。...
    茶點(diǎn)故事閱讀 38,646評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锥债,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哮肚,我是刑警寧澤登夫,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站允趟,受9級特大地震影響恼策,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜潮剪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一涣楷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧抗碰,春花似錦狮斗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至捍壤,卻和暖如春骤视,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鹃觉。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工专酗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人盗扇。 一個(gè)月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓祷肯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親疗隶。 傳聞我的和親對象是個(gè)殘疾皇子佑笋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評論 2 348

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