1. 程式人生 > >IOS開發學習筆記十三 UIScrollView控制元件實現輪播圖

IOS開發學習筆記十三 UIScrollView控制元件實現輪播圖

效果圖:專案地址

效果圖

程式碼:

#import "ViewController.h"

@interface ViewController ()<UIScrollViewDelegate>

@property (weak, nonatomic) IBOutlet UIScrollView *scrollViewContent;
@property (weak, nonatomic) IBOutlet UIImageView *ivLastView;
@property (weak, nonatomic) IBOutlet UIScrollView *scrollViewSlider;
@property
(weak, nonatomic) IBOutlet UIPageControl *pageControl; // 建立一個用來引用計時器物件的屬性 @property (nonatomic, strong) NSTimer *timer; @end @implementation ViewController // 實現UIScrollView的滾動方法 - (void)scrollViewDidScroll:(UIScrollView *)scrollView { // 如何計算當前滾動到了第幾頁? // 1. 獲取滾動的x方向的偏移值 CGFloat offsetX = scrollView.contentOffset
.x; // 用已經偏移了得值, 加上半頁的寬度 offsetX = offsetX + (scrollView.frame.size.width * 0.5); // 2. 用x方向的偏移的值除以一張圖片的寬度(每一頁的寬度),取商就是當前滾動到了第幾頁(索引) int page = offsetX / scrollView.frame.size.width; // 3. 將頁碼設定給UIPageControl self.pageControl.currentPage = page; NSLog(@"滾了,要在這裡根據當前的滾動來計算當前是第幾頁。"
); } // 實現即將開始拖拽的方法 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { // 停止計時器 // 呼叫invalidate一旦停止計時器, 那麼這個計時器就不可再重用了。下次必須重新建立一個新的計時器物件。 [self.timer invalidate]; // 因為當呼叫完畢invalidate方法以後, 這個計時器物件就已經廢了,無法重用了。所以可以直接將self.timer設定為nil self.timer = nil; } // 實現拖拽完畢的方法 - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { // 重新啟動一個計時器 self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(scrollImage) userInfo:nil repeats:YES]; // 再次修改一下新建立的timer的優先順序 // 修改self.timer的優先順序與控制元件一樣 // 獲取當前的訊息迴圈物件 NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; // 改變self.timer物件的優先順序 [runLoop addTimer:self.timer forMode:NSRunLoopCommonModes]; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. NSString *sandBox = NSHomeDirectory(); NSLog(@"%@", sandBox); CGFloat maxH = CGRectGetMaxY(self.ivLastView.frame); // 設定UIScrollView的contentSize self.scrollViewContent.contentSize = CGSizeMake(0, maxH); // 設定預設滾動位置 self.scrollViewContent.contentOffset = CGPointMake(0, -44); // 設定距離上面的始終有74的內邊距 self.scrollViewContent.contentInset = UIEdgeInsetsMake(44, 0, 54, 0); [self initSlider]; } - (void)initSlider{ // 動態建立UIImageView新增到UIScrollView中 CGFloat imgW = 375; CGFloat imgH = 168; CGFloat imgY = 0; // 1. 迴圈建立5個UIImageView新增到ScrollView中 for (int i = 0; i < 5; i++) { // 建立一個UIImageView UIImageView *imgView = [[UIImageView alloc] init]; // 設定UIImageView中的圖片 NSString *imgName = [NSString stringWithFormat:@"img_%02d", i + 1]; imgView.image = [UIImage imageNamed:imgName]; // 計算每個UIImageView在UIScrollView中的x座標值 CGFloat imgX = i * imgW; // 設定imgView的frame imgView.frame = CGRectMake(imgX, imgY, imgW, imgH); // 把imgView新增到UIScrollView中 [self.scrollViewSlider addSubview:imgView]; } // 設定UIScrollView的contentSize(內容的實際大小) CGFloat maxW = self.scrollViewSlider.frame.size.width * 5; self.scrollViewSlider.contentSize = CGSizeMake(maxW, 0); // 實現UIScrollView的分頁效果 // 當設定允許分頁以後, UIScrollView會按照自身的寬度作為一頁來進行分頁。 self.scrollViewSlider.pagingEnabled = YES; // 隱藏水平滾動指示器 self.scrollViewSlider.showsHorizontalScrollIndicator = NO; // 指定UIPageControl的總頁數 self.pageControl.numberOfPages = 5; // 指定預設是第0頁 self.pageControl.currentPage = 0; // 建立一個"計時器"控制元件NSTimer控制元件 // 通過scheduledTimerWithInterval這個方法建立的計時器控制元件, 建立好以後自動啟動 self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(scrollImage) userInfo:nil repeats:YES]; // 修改self.timer的優先順序與控制元件一樣 // 獲取當前的訊息迴圈物件 NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; // 改變self.timer物件的優先順序 [runLoop addTimer:self.timer forMode:NSRunLoopCommonModes]; } // 自動滾動圖片的方法 // 因為在建立計時器的時候, 指定了時間間隔是1.0秒,所以下面這個方法每隔一秒鐘執行一次 - (void)scrollImage { // 每次執行這個方法的時候, 都要讓圖片滾動到下一頁 // 如何讓UIScrollView滾動到下一頁? // 1. 獲取當前的UIPageControl的頁碼 NSInteger page = self.pageControl.currentPage; NSLog(@"當前page ==== %d",page); // 2. 判斷頁碼是否到了最後一頁, 如果到了最後一頁, 那麼設定頁碼為0(回到第一頁)。如果沒有到達最後一頁, 則讓頁碼+1 if (page == self.pageControl.numberOfPages - 1) { // 表示已經到達最後一頁了 page = 0; // 回到第一頁 } else { page++; } NSLog(@"計算後的page ==== %d",page); // 3. 用每頁的寬度 * (頁碼 + 1) == 計算除了下一頁的contentOffset.x CGFloat offsetX = self.scrollViewSlider.frame.size.width*page; NSLog(@"計算後的offsetX ==== %d",offsetX); // 4. 設定UIScrollView的contentOffset等於新的偏移的值 [self.scrollViewSlider setContentOffset:CGPointMake(offsetX, 0) animated:YES]; // 如果圖片現在已經滾動到最後一頁了, 那麼就滾動到第一頁 } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end