ios 圖片自動輪播

這裏寫圖片描述

#import "NYViewController.h"

#define kImageCount 5

@interface NYViewController () <UIScrollViewDelegate>
@property (nonatomic, strong) UIScrollView *scrollView;
@property (nonatomic, strong) UIPageControl *pageControl;

@property (nonatomic, strong) NSTimer *timer;
@end

@implementation NYViewController

//懶加載加載scrollView
-(UIScrollView *)scrollView
{
    if (_scrollView == nil) {
        _scrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(10, 20, 300, 130)];
        _scrollView.backgroundColor = [UIColor redColor];

        [self.view addSubview:_scrollView];

        //contentSize
        //高度爲0 只水平滾動
        self.scrollView.contentSize = CGSizeMake(kImageCount * _scrollView.bounds.size.width, 0);

        //取消彈簧效果
        _scrollView.bounces = NO;

        //取消滾動條
        _scrollView.showsHorizontalScrollIndicator = NO;//水平
        _scrollView.showsVerticalScrollIndicator = NO;//豎直

        //要分頁
        _scrollView.pagingEnabled = YES;

        //設置代理
        _scrollView.delegate = self;



    }
    return _scrollView;
}

-(UIPageControl *)pageControl
{
    if (_pageControl == nil) {
        //分頁控件,本質上和scrollView沒有任何關係,是兩個獨立的控件
        _pageControl = [[UIPageControl alloc]init];

        //總頁數
        _pageControl.numberOfPages = kImageCount;
        //控件尺寸
        CGSize size = [_pageControl sizeForNumberOfPages:kImageCount];

        _pageControl.bounds = CGRectMake(0, 0, size.width, size.height);
        _pageControl.center = CGPointMake(self.view.center.x, 130);

        //設置顏色
        _pageControl.pageIndicatorTintColor = [UIColor redColor];
        _pageControl.currentPageIndicatorTintColor = [UIColor blackColor];

        [self.view addSubview:_pageControl];

        //添加監聽方法
        /**在OC中,絕大多數「繼承UIControl控件」,均可以監聽UIControlEventValueChanged事件,只有button除外,button是點得,是touchup。。。*/
        [_pageControl addTarget:self action:@selector(pageChanged:) forControlEvents:UIControlEventValueChanged];
    }
    return _pageControl;
}

//分頁控件的監聽方法
-(void)pageChanged:(UIPageControl *)page
{
    //根據頁數,調整滾動視圖中得圖片位置contentOffset
    CGFloat x = page.currentPage * self.scrollView.bounds.size.width;
    [self.scrollView setContentOffset:CGPointMake(x, 0) animated:YES];
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    //設置圖片
    for (int i = 0; i<kImageCount; i++) {
        NSString *imageName = [NSString stringWithFormat:@"img_%02d", i+1 ];
        UIImage *image = [UIImage imageNamed:imageName];

        UIImageView *imageView = [[UIImageView alloc] initWithFrame: self.scrollView.bounds];
        imageView.image = image;

        [self.scrollView addSubview:imageView];
    }

    //計算imageView的位置
    [self.scrollView.subviews enumerateObjectsUsingBlock:^(UIImageView *imageView, NSUInteger idx, BOOL *stop) {
        //調整x =》 origin =》frame
        CGRect frame = imageView.frame;
        frame.origin.x = idx * frame.size.width;
        imageView.frame = frame;

    }];

    //分頁初始頁數爲0
    self.pageControl.currentPage = 0;

    //啓動時鐘
    [self startTimer];

}

/**啓動時鐘*/
-(void)startTimer
{
    self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(updateTimer) userInfo:nil repeats:YES];

    //添加運行循環
    [[NSRunLoop currentRunLoop]addTimer:self.timer forMode:NSRunLoopCommonModes];

}

-(void)updateTimer
{
    //頁號發生變化
    //(當前頁數 + 1) % 總頁數
    int page = (self.pageControl.currentPage+1) % kImageCount;
    self.pageControl.currentPage = page;
    //調用監聽方法。讓滾動視圖滾動
    [self pageChanged:self.pageControl];
}

#pragma mark - scrollView的代理方法

//滾動視圖停下來
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    // 停下來的當前頁數,經過contentOffset獲取當前偏移量
    NSLog(@"%@",NSStringFromCGPoint(scrollView.contentOffset));

    //計算頁數
    int page = scrollView.contentOffset.x/scrollView.bounds.size.width;

    self.pageControl.currentPage = page;



}

/**
 抓住圖片時,中止時鐘,鬆手後,開啓時鐘
 */
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    //中止時鐘,中止後就不能在使用,若是要啓用時鐘,須要從新實例化
    [self.timer invalidate];
}


-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    //啓動時鐘
    [self startTimer];

}
@end
相關文章
相關標籤/搜索