ios例子12 pageControl和UIScrollView

http://www.tuicool.com/articles/YJNZFf

下面介绍pageControl结合ScrollVie w 实现连续滑动翻页的效果, ScrollVie w我们在应用开发中经常用到,以g 这种翻页效果还是很好看的,如下图所示:

通过这个例子,我们重点学习UIScrollView  UIScrollView 滚动的效果主要的原理是修改他的坐标,准确的讲是修改原点坐标,这一点我们在下面代码中自行体会。在动手创建工程之前,先了解以下几点:

UIScrollView学习要点

1. 注意只有UIScrollView,没有UIScrollViewController。 

UiScrollView同许多控件一样有自己的delegate,但它不像UIView或TabelViewController有自带的ViewController。

一般实现方式是把包含scrollView的UIView对应的UIViewController实现UIScrollViewDelegate。如下图所示。

UIScrollViewDelegate包含了UIScrollView的生命周期方法,如  scrollViewDidScroll(滑动后),scrollViewWillBeginDragging(滑动开始),scrollViewDidEndDecelerating(滑动结束)等方法,用于监听页面拖拽。

2. 一次滑动,scrollView的 scrollViewDidScroll会执行多次。

因此一般需要一个标识符来判断是否要执行scrollViewDidScroll中的自定义代码。

3. UIScrollView属性: 参考http://www.cnblogs.com/woainilsr/archive/2012/03/28/2421881.html

创建工程

1.同上一个例子中布局storyBoard,不同的是, 使用UIScrollView而不是UIView。

2.设置TestViewController.h

    如下图所示:

    在接口声明中,参考 UIScrollView学习要点 1,继承UIScrollViewDelegate,后面在TestViewController.m中实现 scrollViewDidScroll等方法。

    参考要点2, 声明私有属性:pageControlUsed标识符。

    关联stroyboard中ScrollView和PageControl至代码中,如图所示。pageControl还要关联Action

    声明一个Array的viewControllers属性,做为要显示的多个页面的载体。

3.实现要显示的页面

    下面实现所显示的彩色页面。 每次翻页时,会提前加载下一个页面, 颜色和中间的label内容与page数相关,这是 调用自定义的 initWithPageNumber方法生成。

    这个不是理解重点。不做解说。

3.1创建一个file继承自UIViewController,同时勾选伴随生成xib选项。

3.2将这个xib按下以设置,size:Freeform(这样才可以改变大小),status Bar:none(隐藏状态条),设置尺寸width:320,height:400.

3.3设置MyPageViewController.h

    添加私有属性pageNumber,关联PageLabel,声明initWithPageNumber方法。

     3.4MyPageViewController.m文件内容如下:

//
//  MyPageViewController.m
//  Test_PageControl
//
//  Created by shimi on 13-4-9.
//  Copyright (c) 2013年 com.shimi. All rights reserved.
//

#import "MyPageViewController.h"
static NSArray *__pageControlColorList = nil;

@interface MyPageViewController ()

@end

@implementation MyPageViewController
@synthesize pageLabel;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
 
    // Mod the index by the list length to ensure access remains in bounds.
    return [__pageControlColorList objectAtIndex:index % [__pageControlColorList count]];
}

// Load the view nib and initialize the pageNumber ivar.
- (id)initWithPageNumber:(int)page {
    if (self = [super initWithNibName:@"MyPageViewController" bundle:nil]) {
        pageNumber = page;
    }
    return self;
}
- (void)viewDidLoad
{
    [super viewDidLoad];
 
        // Custom initialization
    }
    return self;
}
+ (UIColor *)pageControlColorWithIndex:(NSUInteger)index {
    if (__pageControlColorList == nil) {
        __pageControlColorList = [[NSArray alloc] initWithObjects:[UIColor redColor], [UIColor greenColor], [UIColor magentaColor],
                                  [UIColor blueColor], [UIColor orangeColor], [UIColor brownColor], [UIColor grayColor], nil];
    }
    // Do any additional setup after loading the view from its nib.
    pageLabel.text = [NSString stringWithFormat:@"Page %d", pageNumber + 1];
    self.view.backgroundColor = [MyPageViewController pageControlColorWithIndex:pageNumber];
}

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

@end

4.翻页实现

    4.1设置一个静态变量KNumberOfPages,这是总页数 引入MyPageViewController.h声明@synthesize

4.2在TestViewController.m的viewDidLoad方法做UIScrollView和PageControl的初始化。

     scrollView的初始化中, scrollView.contentSize是它的拖动范围。 因为要翻7页,所以最后UIScrollView的宽度将变为7个屏幕宽。另外高度与要显示的页面一样高(MyPageViewController.xib的高度设置为400),如果 scrollView的高度 >400,最后出来的效果是上下可以拖动。

    pageControl的初始化中,  pageControl . numberOfPages = KNumberOfPages/ /出现7个点 pageControl . currentPage = 0 ;//默认高亮在第0个点

    loadScrollViewWithPage方法实现如下,如果页面已经被加载过,不会重复生成。

4.3UIScrollViewDelegate的生命周期及 scrollViewDidScroll的多次加载

    在ScrollView的初始化中,设置了 scrollView.delegate=self。且TestViewController.h中继承了UIScrollerViewDelegate。在 TestViewController.m实现了 scrollViewDidScroll(滑动后),scrollViewWillBeginDragging(滑动开始),scrollViewDidEndDecelerating(滑动结束)方法,用于监听页面拖拽。

    scrollViewDidScroll在两种动作下会被触发, 点击pageControl的点、或左右滑动scrollView区域。

    1. 左右滑动scrollView区域:只 触发scrollViewDidScroll方法

    2. 点击pageControl的点: 触发changePage方法,同时 触发scrollViewDidScroll方法。 changePage和 scrollViewDidScroll中完成的是同样的事情。区别是 scrollViewDidScroll中的page需要通过计算得出。

    因此在changePage中会把pageControlUsed=YES,这样在 scrollViewDidScroll中就会直接返回。而在 滑动开始和结束时将pageControlUsed重置为NO.

    另外scrollViewDidScroll会执行多次(可能是滑动操作是持续的,这个过程中一直触发scroll方法)。是在这个 过程 中完成第二个page的加载的,我们通过计算通过pageControl.currentPage是否等于计算出的page, 来确定pageControlUsed=YES的时间点 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本Demo使用UICollectionView实现自动无限轮播功能。 主要功能: 1.实现自动轮播,可修改轮播的时间 2.轮播图片可以来自本地,也可来自网络,通过单独的方法进行设置即可。对于加载网络图片时,Demo中使用了YYWebImage,也可自行替换成SDWebImage。 3.重写了和系统UIPageControl一样的功能,可用图片代替PageControl上的点点,也可自定义其颜色以及切换动画。 使用方法:使用方法比较简单。 /** * 加载本地图片Banner */ - (void)setupLocalBannerImageView { NSArray *array = @[@"1.png", @"2.png", @"3.png", @"4.png", @"5.png"]; FFBannerView *bannerVew = [FFBannerView bannerViewWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 200) locationImageArray:array]; bannerVew.timeInterval = 2.0; [self.view addSubview:bannerVew]; } /** * 加载网络图片Banner */ - (void)setupNetWorkBannerImageView { NSArray *array = @[@"http://i3.download.fd.pchome.net/t_960x600/g1/M00/07/09/oYYBAFMv8q2IQHunACi90oB0OHIAABbUQAAXO4AKL3q706.jpg", @"http://images.weiphone.net/attachments/photo/Day_120308/118871_91f6133116504086ed1b82e0eb951.jpg", @"http://benyouhuifile.it168.com/forum/macos/attachments/month_1104/110425215921926a173e0f728e.jpg", @"http://benyouhuifile.it168.com/forum/macos/attachments/month_1104/1104241737046031b3a754f783.jpg"]; FFBannerView *bannerVew = [FFBannerView bannerViewWithFrame:CGRectMake(0, 250, [UIScreen mainScreen].bounds.size.width, 200) netWorkImageArray:array placeHolderImage:nil]; bannerVew.timeInterval = 2.0; bannerVew.pageControlStyle = FFPageControlStyleMiddle; bannerVew.delegate = self; [self.view addSubview:bannerVew]; } 以上方式即可简单使用,如需自定义PageControl也可继承FFAbstractDotView,做些基本的设置即可。 gitHub下载地址:喜欢的朋友请给个星呗! 欢迎各位一起来讨论,有问题请发邮箱270452746@qq.com或者直接加我QQ:270452746进行讨论。谢谢!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值