文章標題小型圖片輪播器

//
// HYViewController.m
// 03-輪播器
//
// Created by apple on 15-4-19.
// Copyright (c) 2015年 apple. All rights reserved.
//

#import "HYViewController.h"
#define HYpageCount 5
@interface HYViewController () <UIScrollViewDelegate>
@property (weak, nonatomic) IBOutlet UIPageControl *pageControl;
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
/** 定時器屬性*/
@property(nonatomic,strong) NSTimer *timer;
@end


@implementation HYViewController

/** 控制器的view加載完畢的時候調用*/
- (void)viewDidLoad
{
    [super viewDidLoad];


    CGFloat imageW=self.scrollView.frame.size.width;
    CGFloat imageH=self.scrollView.frame.size.height;
    CGFloat imageY=0;

    for(int i=0;i<HYpageCount;i++)
    {
        //1.建立UIImageView控件
        UIImageView *imageView=[[UIImageView alloc]init];

        //2. 設置圖片
        NSString *name=[NSString stringWithFormat:@"img_0%d",i+1];
        imageView.image =[UIImage imageNamed:name];

        //3.設置frame
        CGFloat imageX= i*imageW;
              imageView.frame=CGRectMake(imageX, imageY, imageW, imageH);
        [self.scrollView addSubview:imageView];
    }

     //4. 設置滾動的範圍
    self.scrollView.contentSize=CGSizeMake(HYpageCount*imageW, 0);

    //5.隱藏水平滾動條
    self.scrollView.showsHorizontalScrollIndicator=NO;

    //是否分頁
    self.scrollView.pagingEnabled=YES;

    //6.添加分頁按鈕
    self.pageControl.numberOfPages=HYpageCount;

    //7.設置代理
    self.scrollView.delegate=self;

    //8. 添加定時器 (每隔兩秒就調用一次self的nextPage方法)
    [self addTimer];




}

/** 添加定時器*/
-(void)addTimer
{
    //self.timer保存一下
    self.timer= [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(nextPage) userInfo:nil repeats:YES];
}

//當用戶執行其餘操做時,讓定時器優先級高點,執行定時器操做
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];


/** 移除定時器*/
-(void)removeTimer
{
    [self.timer invalidate ];
    self.timer=nil;
}

/** 當用戶開始拖拽的時候調用*/
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    //中止定時器,中止以後,此刻的定時器不能用了
    [self removeTimer];
}

/** 用戶徹底中止拖拽的時候調用*/
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    //以前在拖拽的時候,定時器不能再用了,這個時候,咱們要從新建立定時器
    [self addTimer];
}


/* 我的理解: 這個方法有個問題:就是存在兩個點之間來回調動的問題, 問題緣由:先 self.pageControl.currentPage++; 點會跳到下一個,而後設置contentOffset以後,會調用 scrollViewDidScroll方法(當scrollview正在滾動的時候就會調用),由於設置contentOffset有動畫,那麼它的contentoffset 是慢慢增長的, int page=self.scrollView.contentOffset.x/scrollW page應該是等於0;那個點又從下一個跳回來了,當contentoffset夠一個寬度的時候,又會往下跳。 */
//-(void)nextPage
//{
// if(self.pageControl.currentPage==HYpageCount-1) //最後一頁,就讓它變爲第0頁
// {
// self.pageControl.currentPage=0;
// }
// else
// {
// self.pageControl.currentPage++;
// }
// 
// CGFloat offsetW=self.scrollView.frame.size.width;
// CGFloat offsetX=self.pageControl.currentPage*offsetW;
// CGPoint offset=CGPointMake(offsetX, 0);
// //設置contenOffset ,並且須要動畫YES,就調用這個方法setContentOffset:animated:
// [self.scrollView setContentOffset:offset animated:YES];
//}

/** 上面的問題解決方法*/
-(void)nextPage
{
    int page=0;
    if(self.pageControl.currentPage==HYpageCount-1) //最後一頁,就讓它變爲第0頁
    {
        page=0;
    }
    else
    {
        //當前頁數加1;
        page=self.pageControl.currentPage+1;
    }

    CGFloat offsetW=self.scrollView.frame.size.width;
    CGFloat offsetX=page*offsetW;
    CGPoint offset=CGPointMake(offsetX, 0);
    //設置contenOffset ,並且須要動畫YES,就調用這個方法setContentOffset:animated:
    [self.scrollView setContentOffset:offset animated:YES];
}


#pragma mark -代理方法
/** * 當scrollview正在滾動的時候就會調用 * *  @param scrollView */
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    //根據UIScrollView的滾動位置,來顯示當前是第幾頁,也就是設置currentPage
    CGFloat scrollW=self.scrollView.frame.size.width;
    int page=self.scrollView.contentOffset.x/scrollW; //顯示的頁數 最好加上一半的寬度

    self.pageControl.currentPage=page;
}
@end

!當出現兩個點來回切換的問題的解決方案

!當用戶用手拖拽的時候,中止後,加速跑動的問題

java

相關文章
相關標籤/搜索