IOS中的UIScrollView
要引用UIScrollView 首先要遵循UIScrollViewDelegate協議
然后重寫
//1.拖拽方法 -(void)scrollViewDidScroll:(UIScrollView *)scrollView; //2.即將開始拖拽的方法 -(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView; //3.拖拽完畢的方法 -(void)scrollViewDidEndDragging:(UIScrolView *) scrollView willDecelerate:(BOOL)decelerate
下面是一個帶輪詢展示界面的小案例
#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

浙公網安備 33010602011771號