IOS中的UIScrollView

要引用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
相關文章
相關標籤/搜索