要引用UIScrollView 首先要遵循UIScrollViewDelegate協議oop
而後重寫atom
//1.拖拽方法 -(void)scrollViewDidScroll:(UIScrollView *)scrollView; //2.即將開始拖拽的方法 -(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView; //3.拖拽完畢的方法 -(void)scrollViewDidEndDragging:(UIScrolView *) scrollView willDecelerate:(BOOL)decelerate
下面是一個帶輪詢展現界面的小案例spa
#import "ViewController.h" @interface ViewController () <UIScrollViewDelegate> @property (weak, nonatomic) IBOutlet UIScrollView *scrollView; @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:1.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]; // 動態建立UIImageView添加到UIScrollView中 CGFloat imgW = 300; CGFloat imgH = 130; 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.scrollView addSubview:imgView]; } // 設置UIScrollView的contentSize(內容的實際大小) CGFloat maxW = self.scrollView.frame.size.width * 5; self.scrollView.contentSize = CGSizeMake(maxW, 0); // 實現UIScrollView的分頁效果 // 當設置容許分頁之後, UIScrollView會按照自身的寬度做爲一頁來進行分頁。 self.scrollView.pagingEnabled = YES; // 隱藏水平滾動指示器 self.scrollView.showsHorizontalScrollIndicator = NO; // 指定UIPageControl的總頁數 self.pageControl.numberOfPages = 5; // 指定默認是第0頁 self.pageControl.currentPage = 0; // 建立一個"計時器"控件NSTimer控件 // 經過scheduledTimerWithInterval這個方法建立的計時器控件, 建立好之後自動啓動 self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(scrollImage) userInfo:nil repeats:YES]; // 修改self.timer的優先級與控件同樣 // 獲取當前的消息循環對象 NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; // 改變self.timer對象的優先級 [runLoop addTimer:self.timer forMode:NSRunLoopCommonModes]; // [self.scrollView bringSubviewToFront:self.pageControl]; } // 自動滾動圖片的方法 // 由於在建立計時器的時候, 指定了時間間隔是1.0秒,因此下面這個方法每隔一秒鐘執行一次 - (void)scrollImage { // 每次執行這個方法的時候, 都要讓圖片滾動到下一頁 // 如何讓UIScrollView滾動到下一頁? // 1. 獲取當前的UIPageControl的頁碼 NSInteger page = self.pageControl.currentPage; // 2. 判斷頁碼是否到了最後一頁, 若是到了最後一頁, 那麼設置頁碼爲0(回到第一頁)。若是沒有到達最後一頁, 則讓頁碼+1 if (page == self.pageControl.numberOfPages - 1) { // 表示已經到達最後一頁了 page = 0; // 回到第一頁 } else { page++; } // 3. 用每頁的寬度 * (頁碼 + 1) == 計算除了下一頁的contentOffset.x CGFloat offsetX = page * self.scrollView.frame.size.width; // 4. 設置UIScrollView的contentOffset等於新的偏移的值 [self.scrollView setContentOffset:CGPointMake(offsetX, 0) animated:YES]; // 若是圖片如今已經滾動到最後一頁了, 那麼就滾動到第一頁 } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end