scrollView ,無限輪播加手勢

#pragma amrk - 初始化
- (void)initScrollViewAndPageWithImgArray:(NSArray *)imgArray andSRect:(CGRect)scrollViewRect andPRect:(CGRect)pageRect
{
    sourceImgArray = [imgArray mutableCopy];
     
    self.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 120);
    self.scrollView = [[UIScrollView alloc] initWithFrame:self.frame];
    self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width*3, self.scrollView.frame.size.height);
    [self.scrollView setContentOffset:CGPointMake(self.scrollView.frame.size.width, 0)];
    self.scrollView.pagingEnabled = YES;
    self.scrollView.delegate = self;
    [self addSubview:self.scrollView];
    //給scrollview添加手勢
    UITapGestureRecognizer *tapges = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(clickAction:)];
    [self.scrollView addGestureRecognizer:tapges];
     
    headImgArrayCount = sourceImgArray.count;
    //加載imgview
    [self addImgViewForScrollView];
     
    self.page = [[UIPageControl alloc] initWithFrame:pageRect];
    self.page.currentPage = 0;
    self.page.numberOfPages = sourceImgArray.count;
    self.page.pageIndicatorTintColor = [UIColor whiteColor];
    self.page.currentPageIndicatorTintColor = [UIColor orangeColor];
    [self addSubview:self.page];  //把page加載到父視圖上
     
    //添加計時器
    time = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(timeAction:) userInfo:nil repeats:YES];
}
 
#pragma mark - 加載imageview的image
- (void)addImgViewForScrollView
{
    //添加imageview到scrollview
    static dispatch_once_t predicate;
    dispatch_once(&predicate;, ^{
        self.leftImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.scrollView.frame.size.width, self.scrollView.frame.size.height)];
        self.centerImageView = [[UIImageView alloc] initWithFrame:CGRectMake(self.scrollView.frame.size.width, 0, self.scrollView.frame.size.width, self.scrollView.frame.size.height)];
        self.rightImageView = [[UIImageView alloc] initWithFrame:CGRectMake(2*self.scrollView.frame.size.width, 0, self.scrollView.frame.size.width, self.scrollView.frame.size.height)];
         
        //設置三個imgview的圖片
        leftImageIndex = headImgArrayCount-1;
        centerImageIndex = 0;
        rightImageIndex = 1;
         
        [self.scrollView addSubview:_leftImageView];
        [self.scrollView addSubview:_centerImageView];
        [self.scrollView addSubview:_rightImageView];
    });
    //加載左邊的imgview,顯示最後一張圖片
    self.leftImageView.image = [UIImage imageNamed:sourceImgArray[leftImageIndex]];
     
    //加載右邊的imgview,顯示第二張圖片
    self.rightImageView.image = [UIImage imageNamed:sourceImgArray[rightImageIndex]];
     
    //加載中間我們能看到的imgview,加載第一張圖片
    self.centerImageView.image = [UIImage imageNamed:sourceImgArray[centerImageIndex]];
     
    //重新讓scrollView便宜在最中間
    [self.scrollView setContentOffset:CGPointMake(self.scrollView.frame.size.width, 0)];
    self.scrollView.userInteractionEnabled = YES;
}
 
#pragma mark - NSTimer計時器觸發事件
- (void)timeAction:(NSTimer *)sender
{
    //剛開始滑動時
    if (self.page.currentPage == headImgArrayCount - 2){  //倒數第二張將要滑到倒數第一張時
        self.page.currentPage = headImgArrayCount-1;
        centerImageIndex = headImgArrayCount - 1;
        rightImageIndex = 0;
        leftImageIndex = centerImageIndex - 1;
    }
    else if (self.page.currentPage == headImgArrayCount -1){   //倒數第一張將要滑到第一張時
        self.page.currentPage = 0;
        centerImageIndex = 0;
        leftImageIndex = headImgArrayCount - 1;
        rightImageIndex = centerImageIndex + 1;
    }
    else{
        self.page.currentPage += 1;
        centerImageIndex = self.page.currentPage;
        leftImageIndex = centerImageIndex - 1;
        rightImageIndex = centerImageIndex + 1;
    }
    //先讓scrollView進行偏移
    [self.scrollView setContentOffset:CGPointMake(self.scrollView.frame.size.width*2, 0) animated:YES];
    //開大scrollview的交互
    self.scrollView.userInteractionEnabled = NO;
}
 
#pragma mark - scrollview輪播代理
//開始拖拽視圖
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;
{
    //停止計時器
    [time setFireDate:[NSDate distantFuture]];
}
 
//當手指在scrollview上停止觸碰的時候點用該方法
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    //手指鬆開時觸發
    if(decelerate){
        self.scrollView.userInteractionEnabled = NO;
    }
}
 
#pragma mark - 當手動滑動,scrollview停止滾動時
//scrollView完全停止,有觸碰事件時
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    //計算滑動停止後的偏移量
    CGFloat contentOffset = scrollView.contentOffset.x-scrollView.frame.size.width;
    //計算翻動的+-
    int offsetPage = contentOffset/scrollView.frame.size.width;
     
    pageNum = self.page.currentPage;
    if(pageNum == 0 && offsetPage == -1){  //判斷當在第1張向左滑時
        pageNum = -1;
    }
    if (pageNum == headImgArrayCount-1 && offsetPage == 1){  //判斷當在最後一張向右滑時
        pageNum = headImgArrayCount;
    }
     
    //紀錄當前scrollview的偏移頁數
    self.page.currentPage += offsetPage;
     
    /*
     * 重新計算選取圖片的下標
     */
    if (pageNum == -1) {  //如果已經滑到scrollview的最前面即取圖片數組的最左邊時
         
        self.page.currentPage = headImgArrayCount-1;
        centerImageIndex = headImgArrayCount-1;
        leftImageIndex = centerImageIndex-1;
        rightImageIndex = 0;
        pageNum = headImgArrayCount;
    }
    else if (pageNum == headImgArrayCount) {
         
        self.page.currentPage = 0;
        centerImageIndex = 0;
        leftImageIndex = headImgArrayCount-1;
        rightImageIndex = centerImageIndex+1;
        pageNum = 0;
    }
    else{
        centerImageIndex = self.page.currentPage;
        leftImageIndex = centerImageIndex-1;
        rightImageIndex = centerImageIndex+1;
        if (self.page.currentPage == 0) {
            leftImageIndex = headImgArrayCount-1;
        }
        if (self.page.currentPage == headImgArrayCount-1) {
            rightImageIndex = 0;
        }
    }
    [self addImgViewForScrollView];
    //重新打開交互,重啓計時器
    self.scrollView.userInteractionEnabled = YES;
    time = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(timeAction:) userInfo:nil repeats:YES];
}
 
#pragma mark - 當計時器啓動,scrollview滾動結束時
//scrollview完全停止,代碼寫時
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView;
{
    //讓imageView換取圖片
    [self addImgViewForScrollView];
}
 
#pragma mark - 點擊scrollView手勢動作
- (void)clickAction:(UITapGestureRecognizer *)sender
{
//    [self.delegate clickImageAction:sourceImgArray[self.page.currentPage]];
 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"MMMHeadScrollView" object:nil userInfo:@{@"MMMHeadScrollView":@(self.page.currentPage)}];
}


下面是點擊事件,可以上下滑動查看



#pragma mark - 點擊scrollView手勢動作
- (void)clickAction:(UITapGestureRecognizer *)sender
{
//    [self.delegate clickImageAction:sourceImgArray[self.page.currentPage]];
  
    [[NSNotificationCenter defaultCenter] postNotificationName:@"MMMHeadScrollView" object:nil userInfo:@{@"MMMHeadScrollView":@(self.page.currentPage)}];
}






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章