20代理_滑动视图UIScrollView_UIPageControl

大纲

一、代理
项目:CustomAlertView0317
1.基本概念
案例:点击alertView(委托者)上的按钮,改变VC1(代理)的背景颜色。alertView通过设置代理VC1,帮VC1调用协议方法changeColor。
委托者:alertView
代理:VC1
协议(协议方法):changeColor

为何协议方法要在代理中实现:其他类可以调用委托者alertView的协议(协议方法),而alertView无法为每个类实现其方法的功能,所以协议方法的实现在各个类本身。

代理的优点:安全(从后往前传值时)

2.代理
(1)非正式版本(学习前奏)
步骤:
①声明代理vc
②在代理中声明、实现协议中的方法
③在委托中调用
(2)正式版本
步骤:
①声明代理、协议方法
②实现协议方法、设置代理
③调用代理
二、滑动视图UIScrollView
项目:UIScrollView0317
步骤:
1.创建Scroll
2.设置Scroll的内容大小,并添加图片
3.设置vc的self,为Scroll的delegate
4.在vc实现Scroll中声明的协议方法
注:委托者(Scroll),代理(vc)。
三、UIPageControl
项目:PageControl0317
步骤:
1.创建并初始化
2.设置属性
3.绑定点击事件

正文

一、代理
项目:CustomAlertView0317
1.基本概念
案例:点击alertView上的按钮,来改变VC1的背景颜色,委托(alertView)通过设置代理(VC1,VC1的背景只能由VC1自己设置),调用协议方法(改变背景颜色的方法),完成相应操作。
简述:点击按钮时,alertView(委托)只负责帮VC1(代理)去调用协议方法。
委托者:alertView
代理:VC1
协议:协议方法(改变VC1的背景,委托者与代理之间的约定)

为何协议方法要在代理中实现:很多类都可以使用委托者alertView的协议(协议方法),而alertView不可能去帮助每个类完成各自指定的操作,所以它将这个任务交给了各个类本身。

代理的优点:安全(从后往前传值时)

2.代理
(1)非正式版本(学习前奏)
步骤:
①声明代理vc
②在代理中声明、实现协议中的方法
③在委托中调用

①声明代理vc
文件:MyAlertView.h

 //容器,水桶
 @property (nonatomic,retain)ViewController *vc;
②在代理中声明、实现协议中的方法
 文件:ViewController.h
 //声明
 - (void)changeColor;
 文件:ViewController.m
 //实现
 - (void)changeColor{self.view.backgroundColor = [UIColor redColor];}
③在委托中调用
 文件:MyAlertView.m
 //2.委托者(alertView)帮代理(viewController)调用协议方法
    //实际上是代理(viewController)自己调用
    [self.vc changeColor];

(2)正式版本
步骤:
①声明代理、协议方法
②实现协议方法、设置代理
③调用代理

①声明代理、协议方法
在委托者中,声明代理、协议方法
文件:MyAlertView.h

 @interface MyAlertView : UIView
 @property (nonatomic,assign)id delegate;
 @end

 @protocol MyAlertViewDelegate 
 - (void)changeColor;
 @end

注意:在@interface @end之外声明协议方法
②实现协议方法、设置代理
文件:ViewController.m
(1)在代理类中实现协议方法、设置代理

 - (void)changeColor{self.view.backgroundColor = [UIColor redColor];}

(2)将代理对象(vc)赋给委托者的代理属性

 myAlertView.delegate = self;

③调用代理
执行协议方法
文件:MyAlertView.m

 [self.delegate changeColor];

注意:
文件:MyAlertView.m

        //如果使用optional描述协议,一般都要有以下判断
        //如果使用required描述协议,不加判断
        if ([self.delegate respondsToSelector:@selector(changeColor)])
        {
            //3.调用代理(正式代理)
            [self.delegate changeColor];
        }

二、滑动视图UIScrollView
项目:UIScrollView0317
步骤:
1.创建Scroll
2.设置Scroll的内容大小,并添加图片
3.设置vc的self,为Scroll的delegate
4.在vc实现Scroll中声明的协议方法
注:委托者(Scroll),代理(vc)。

源码:

@interface ViewController ()
{
    //速度/当前页
    int _speed,_currentPage;
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //1.创建
    UIScrollView *scrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, SCREEN_BOUNDS.size.width,400)];
    //2.1设置内容大小(contentSize)
    scrollView.contentSize = CGSizeMake(SCREEN_BOUNDS.size.width * 5, 400);
    //2.2添加图片内容
    for (int i = 0; i < 5; i++)
    {
        UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(i * SCREEN_BOUNDS.size.width, 0, SCREEN_BOUNDS.size.width, 400)];
        imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%d.jpg",i]];
        [scrollView addSubview:imageView];
    }
    //3.设置代理
    scrollView.delegate = self;
    //初始速度
    _speed = 1;
    _timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(changeImage:) userInfo:scrollView repeats:YES];
    [self.view addSubview:scrollView];
}
//开启定时器
- (void)changeImage:(NSTimer *)timer
{
    UIScrollView *scrollView = timer.userInfo;
    //每次page加1
    //1.确定速度(+1/-1)
    //2.确定当前页是否为最后一页
    if (_currentPage == 0)
    {
        _speed = 1;
    }
    if (_currentPage == 4)
    {
        _speed = -1;
    }
    _currentPage += _speed;
    //3.改变scrollView的偏移量
    [scrollView setContentOffset:CGPointMake(SCREEN_BOUNDS.size.width * _currentPage, 0) animated:YES];
}
#pragma mark 4.实现scrollView的协议方法
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    if (_timer)
    {
        //将要开始拖拽的时候,关闭定时器
        [_timer invalidate];
        _timer = nil;
    }
}
//屏幕已经停止减速
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    //根据偏移量,计算当前页
    _currentPage = scrollView.contentOffset.x / SCREEN_BOUNDS.size.width;
    if (_timer == nil)
    {
        //开启定时器
        _timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(changeImage:) userInfo:scrollView repeats:YES];
    }
}
@end

三、UIPageControl
项目:PageControl0317
步骤:
1.创建并初始化
2.设置属性
3.绑定点击事件
文件:ViewController.m

- (void)viewDidLoad {
    [super viewDidLoad];
    //1.创建并初始化
    UIPageControl *pageControl = [[UIPageControl alloc]initWithFrame:CGRectMake(100, 200, 100, 30)];
    //2.设置属性
    pageControl.numberOfPages = 5;
    pageControl.backgroundColor = [UIColor redColor];
    pageControl.currentPageIndicatorTintColor = [UIColor blackColor];
    pageControl.pageIndicatorTintColor = [UIColor yellowColor];
    //3.绑定点击事件
    //UIControlEventValueChanged:值发生改变时触发该事件
    [pageControl addTarget:self action:@selector(changeImage:) forControlEvents:UIControlEventValueChanged];
    [self.view addSubview:pageControl];
}
//3.1 实现所绑定的点击事件
- (void)changeImage:(UIPageControl *)pageControl
{
    NSLog(@"currentPage = %d",pageControl.currentPage);
}

四、实际操作
1.个人信息→设置姓名
反向传值(使用代理模式):
步骤:

  1. 声明代理、协议方法
  2. 实现协议方法、设置代理
  3. 委托中调用代理
    2.UIScrollView与PageControl的结合

你可能感兴趣的:(20代理_滑动视图UIScrollView_UIPageControl)