1. 程式人生 > >iOS開發 -- 圖片輪播(詳解)

iOS開發 -- 圖片輪播(詳解)

一個簡單的圖片輪播期小Demo,用了UIScrollView和UIPageControl的巧妙搭配.
能夠實現圖片的輪播,用定時器(NSTimer)控制.當按住圖片的不動的時候,計時器停止,當鬆開圖片的時候計時器又開始.
能夠實現簡單的多執行緒.當滑動其他事件的時候,輪播事件不受影響. 區別了訊息機制(NSRunloop)裡 預設屬性NSDefaultRunLoopMode(單執行緒) 和 另外一個屬性NSRunLoopCommonModes(多執行緒).
希望能夠幫助到一些人.

#import "RootViewController.h"

@interface RootViewController
()< UIScrollViewDelegate>
@property (nonatomic,retain) UIScrollView *scrollView; @property (nonatomic,retain) UIPageControl *pageControl; @property (nonatomic,strong)NSTimer *timer; @end @implementation RootViewController -(void)dealloc{ self.scrollView = nil; self.pageControl = nil; [super
dealloc]; } - (void)viewDidLoad { [super viewDidLoad]; //整體佈局 [self layout]; }
#pragma  mark -- 佈局
-(void)layout{
    //佈局ScrollView
    self.scrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(20,40, 280, 130)];
    [self.view addSubview:_scrollView];
    [_scrollView release];
    //佈局pagecontrol
self.pageControl = [[UIPageControl alloc]initWithFrame:CGRectMake(100, 140, 200, 30)]; [self.view addSubview:_pageControl]; [_pageControl release]; int count = 5; CGSize size = self.scrollView.frame.size; //1 動態生成5個imageView for (int i = 0; i < count; i++) { // UIImageView *iconView = [[UIImageView alloc] init]; [self.scrollView addSubview:iconView]; NSString *imgName = [NSString stringWithFormat:@"img_%02d",i+1]; iconView.image = [UIImage imageNamed:imgName]; CGFloat x = i * size.width; //frame iconView.frame = CGRectMake(x, 0, size.width, size.height); } //2 設定滾動範圍 self.scrollView.contentSize = CGSizeMake(count * size.width, 0); self.scrollView.showsHorizontalScrollIndicator = NO; //3 設定分頁 self.scrollView.pagingEnabled = YES; //4 設定pageControl self.pageControl.numberOfPages = count; self.pageControl.currentPageIndicatorTintColor = [UIColor blueColor]; self.pageControl.pageIndicatorTintColor = [UIColor blackColor]; //5 設定scrollView的代理 self.scrollView.delegate = self; //6 新增定時器 [self addTimerTask]; //新增測試View 當點選滑動textView時候 看看圖片是否滑動 若是滑動則多執行緒成功 若是停止則是單執行緒 UITextView *testTextView = [[UITextView alloc]initWithFrame:CGRectMake(60, 260, 200, 250)]; testTextView.text = @"新增測試View 當滑動textView時候 看看圖片是否滑動 若是滑動則多執行緒成功 若是停止則是單執行緒 主要原因是訊息機制裡 預設屬性NSDefaultRunLoopMode是單執行緒用的 是另外一個屬性NSRunLoopCommonModes能夠在多執行緒中起作用"; testTextView.font = [UIFont fontWithName:@"Arial" size:25]; [self.view addSubview:testTextView]; [testTextView release]; }
//把定時器封裝起來 方便呼叫
-(void)addTimerTask{
    //6 定時器
    NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(nextImage) userInfo:nil repeats:YES];

    self.timer = timer;

    //訊息迴圈
    NSRunLoop *runloop = [NSRunLoop currentRunLoop];
    // 預設是NSDefaultRunLoopMode  但是另外一個屬性NSRunLoopCommonModes 能夠在多執行緒中起作用
    [runloop addTimer:timer forMode:NSDefaultRunLoopMode];

    //立即執行定時器的方法  fire 是定時器自帶的方法
    // [timer fire];

}
-(void)nextImage{
    //當前頁碼
    NSInteger page = self.pageControl.currentPage;
    //如果是到達最後一張
    if (page == self.pageControl.numberOfPages - 1) {
        page = 0;
        //設定偏移量  當到達最後一張時候 切換到第一張  不產生從最後一張倒回第一張效果
        _scrollView.contentOffset = CGPointMake(50, 0);
        [_scrollView setContentOffset:_scrollView.contentOffset animated:YES];
    }else{
        page++;
    }
    //  self.scrollView setContentOffset:(CGPoint) animated:(BOOL)

    CGFloat offsetX = page * self.scrollView.frame.size.width;
    [UIView animateWithDuration:1.0 animations:^{
        self.scrollView.contentOffset = CGPointMake(offsetX, 0);
    }];
}
#pragma mark - - 實現ScrollView代理方法

//正在滾動的時候
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
    //   (offset.x + 100/2)/100
    int page = (scrollView.contentOffset.x + scrollView.frame.size.width / 2)/ scrollView.frame.size.width;
    self.pageControl.currentPage = page;
}
//當你點選圖片按住不動的時候 把定時器停止
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
//停止定時器
    [self.timer invalidate];
}
//當不再按圖片 也就是鬆開的時候 立馬呼叫計時器方法
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{

    //用scheduledTimerWithTimeInterval 建立定時器是用的系統預設的方法 當遇見多執行緒時候會出現問題
//    self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(nextImage) userInfo:nil repeats:YES];
    //所以還是呼叫上面建立的定時器方法
    [self addTimerTask];
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end