UIScrollView的

 掌握

UIScrollView的常见属性

 

UIScrollView的常用代理方法

 

UIScrollView的缩放

 

UIScrollViewUIPageControl的分页

 

NSTimer的使用

 

什么是UIScrollView

移动设备的屏幕大小是极其有限的,因此直接展示在用户眼前的内容也相当有限

 

当展示的内容较多,超出一个屏幕时,用户可通过滚动手势来查看屏幕以外的内容

 

普通的UIView不具备滚动功能,不能显示过多的内容

 

UIScrollView是一个能够滚动的视图控件,可以用来展示大量的内容,并且可以通过滚动查看所有的内容

 

举例:手机上的设置、其他示例程序

UIScrollView的基本使用

UIScrollView 的用法很简单

将需要展示的内容添加到UIScrollView

设置UIScrollViewcontentSize属性,告诉UIScrollView所有内容的尺寸,也就是告诉它滚动的范围(能滚多远,滚到哪里是尽头)

 

计算机生成了可选文字:U | ScrollView 无 法 滚 动 的 解 决 办 法 · 如 果 U 旧 cr 创 Mew 无 法 滚 动 , 可 能 是 以 下 原 因 : ” 没 有 设 EcontentSize scrollEnabled = NO 惠 CO 冶 V w, 的 属 ' 有 接 收 到 触撲事 件 :userlnteractionEnabled = NO ” 没 有 取 消 auto 丨 ayout 功 能 ( 如 果 在 s10 ' yboard 中 添 加 了 S “ View 的 子 控 件 , 要 想 scrollView 滚 勐 . 必 须 取 消 autolayout) , 川 竇 , 承 101 . 人 只 承 , .go ' ' d Opensin · 轟 LA 、 out 0

 

UIScrollView的常见属性

@property(nonatomic) CGSize contentSize; 

这个属性用来表示UIScrollView内容的尺寸,滚动范围(能滚多远)

 

@property(nonatomic)CGPoint contentOffset; 

(又叫内容偏移量:内容左上角减去scoreView左上角差值,用户只要稍微动一下,图片就会再次弹回原始的位置)

 

这个属性用来表示UIScrollView滚动到的位置

@property(nonatomic) UIEdgeInsets contentInset; 

这个属性能够在UIScrollView4周增加额外的滚动区域(也可以把这个理解成周围的厚度)

 

计算机生成了可选文字:contenllnset.top contentlnset.left contentOifset _ y contentOifset.x frame. see.height contentlnset.rie contentlnset bottom frame.size.width

 

UIScrollView的其他属性

@property(nonatomic) BOOL bounces;

设置UIScrollView是否需要弹簧效果

 

@property(nonatomic,getter=isScrollEnabled) BOOLscrollEnabled; 

设置UIScrollView是否能滚动

 

@property(nonatomic)BOOL showsHorizontalScrollIndicator;

是否显示水平滚动条

 

@property(nonatomic)BOOL showsVerticalScrollIndicator;

是否显示垂直滚动条

 

tracking

touch 后还没有拖动的时候值是YES,否则NO

 

zoomBouncing

当内容放大到最大或者最小的时候值是 YES,否则NO

 

zooming

当正在缩放的时候值是 YES,否则NO

 

decelerating

当滚动后,手指放开但是还在继续滚动中。这个时候是 YES,其它时候是 NO

 

decelerationRate

设置手指放开后的减速率

 

maximumZoomScale

一个浮点数,表示能放最大的倍数

 

minimumZoomScale

一个浮点数,表示能缩最小的倍数

 

pagingEnabled

当值是 YES 会自动滚动到 subview 的边界。默认是NO

 

scrollEnabled

决定是否可以滚动

 

 

 

 

 如果scrollView不是通过storyboardxib创建,那么一开始的subviews里面没有子控件这就是和手动创建的最大的区别

 

在scoreView里面在水平滚动条和垂直滚动条没有设置为NO的情况下,它也算做ScrollView的一部分(在scoreView里面删除子控件的时候要格外的注意,但是可以把这两个滚动条给禁止设置为NO)

    

 

 意思是需要动画  但是时间是苹果自己定义的 第一个参数是你要滚动到的位置  第二个参数是是否要动画效果!

   [self.scrollView setContentOffset:CGPointMake(0, self.scrollView.contentOffset.y) animated:YES];

         是否有弹簧效果

        self.scrollView.bounces = NO;

    

         不管有没有contentSize,都能拥有弹簧效果(一般适用于下拉刷新功能,上拉刷新)

        self.scrollView.alwaysBounceVertical = YES; (弹簧效果)

 

        self.scrollView.alwaysBounceHorizontal = YES;(水平效果可以滚来滚去)

    

         是否要显示滚动条

        self.scrollView.showsHorizontalScrollIndicator = NO;

        self.scrollView.showsVerticalScrollIndicator = NO;

    

        self.scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;

    

        NSLog(@"%@", self.scrollView.subviews);

    

        [[self.scrollView.subviews firstObject] removeFromSuperview];

 

    /**

    UIControlStateNormal;

    UIControlStateHighlighted;

     UIControlStateDisabled; 禁止状态//只能通过enabled=NO达到这个状态

设置userInteractionEnabled=NO,可以禁止一些事件,比如点击和拉拽(意思是禁止和用户交互)

    */

    

  

 

 

计算机生成了可选文字:UIScroUView 对 熏 子 控 件 数 组

 

 

UIScrollView的代理(delegate

 

代理三部曲:作用

1.代理一般都是控制器对象

2.代理一般都是id类型 (注意代理是弱指针,如果是强指针会内存泄露)

3.代理协议的格式:控件类名Delegata

4.代理方法:方法名一般都是以控件名开头,比如UIScrollView的代理方法就是ScrollViewDelegata

5.如何监听控件的行为

通过addTarget(只有继承自UIControl的控件,才有这个功能)

 

 

通过Delegate(只有拥有delagate的属性的控件,才有这个功能,有的控件两个功能都有)

(比如让控制器监听ScoreView的行为)

注意:给其设置背景色的时候只有运行的时候才能看到

 

1.设置scorollViewdeledate(代理)为控制器对象

scorollView.deledata = 控制器

 

2.控制器要遵守协议 <UIScrollViewDelegata>

 

3.控制器要实现UIscoreView协议里面的代理方法

 

很多时候,我们想在UIScrollView正在滚动 或滚动到某个位置 或者 停止滚动 时做一些特定的操作

要想完成上述功能,前提条件就是能够监听到UIScrollView的整个滚动过程

UIScrollView发生一系列的滚动操作时, 会自动通知它的代理(delegate)对象,给它的代理发送相应的消息,让代理得知它的滚动情况

也就是说,要想监听UIScrollView的滚动过程,就必须先给UIScrollView设置一个代理对象,然后通过代理得知UIScrollView的滚动过程

计算机生成了可选文字:unterface urscrouview epackage _detegate; : UIView dSCodings contentOffset•, contentSize; contentlnset; delegate; eproperty(nonatomic) eproperty(nonatomic) CGPoint CGSize UIEdgeInsets id«UIScrol IV iewOe legate»

 

    //仔细看这个方法

    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"minion"]];

    这个方法的意思是通过一张图片来初始化这个UIImageView,并且UIImageView的尺寸就是图片的尺寸!

 

   [scrollView addSubview:imageView];

   scrollView.contentSize = imageView.frame.size;

    

    //设置代理(监听scrollView的各种行为)

   scrollView.delegate = self;

 

#pragma mark - <UIScrollViewDelegate>  代理方法

/**

 *  只要scrollView在滚动,就会调用这个方法(监听scrollView的滚动)

 */

- (void)scrollViewDidScroll:(UIScrollView*)scrollView

{

//   NSLog(@"scrollViewDidScroll");

}

 

/**

 *  用户即将开始拖拽scrollView,就会调用这个方法

 */

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView

{

    NSLog(@"scrollViewWillBeginDragging");

}

 

/**

 *  用户即将停止拖拽scrollView,就会调用这个方法

 */

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint*)targetContentOffset

{

//   NSLog(@"scrollViewWillEndDragging");

}

 

/**

 * scrollView已经停止减速,就会调用这个方法(停止滚动)

 */

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

{

    NSLog(@"scrollView减速完毕,停止滚动,完全静止");

}

 

/**

 *  用户已经停止拖拽scrollView,就会调用这个方法

 */

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate

{

    if (decelerate == NO){

        NSLog(@"scrollView停止滚动,完全静止");

    } else {

        NSLog(@"用户停止拖拽,但是scrollView由于惯性,会继续滚动,并且减速");

    }

}

 

textField的代理方法

/**

 *  textField的输入文字发生改变时,就会调用这个方法

 *

 *  @param string    用户当时输入的文字 (NSRange暂且不要管)

 *

 *  @return YES:允许用户输入;NO:禁止用户输入

 */

- (BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)rangereplacementString:(NSString *)string

{

    if ([string isEqualToString:@"0"]) returnNO;

    

    return YES;

}

 

 

UIScrollViewdelegate的通信

计算机生成了可选文字:. 在 OC 中 , 发 送 消 息 的 意 思 就 是 调 用 方 法 因 此 U IScrollView 和 delegate 的 通 信 可 以 理 解 为 下 图 所 示 用 户 开 始 拖 拽 时 , 调 用 特 定 的 方 法 具 体 滚 动 到 某 个 位 置 时 , 调 用 特 定 的 方 法 UIScrollView 用 户 停 止 拖 拽 时 , 调 用 特 定 的 方 法 delegate

 

计算机生成了可选文字:i#scrollViewDidEndD ragg ing : wi lerate: %ähurscr011Viewfide1egate, delegate UIScr011View

 

成为delegate的条件

UIScrollViewdelegate需要实现的方法都定义在了UIScrollViewDelegate协议中,因此要想成为UIScrollViewdelegate,必须遵守UIScrollViewDelegate协议,然后实现协议中相应的方法,就可以监听UIScrollView的滚动过程了

 

计算机生成了可选文字:unterface urscrouview epackage _delegate; : UIView 01SCoding* contentOffset; contentSize; contentlnset ; delegate; eprope rty( nonatomic) @prope rty( nonatomic) CGpoint CGSize UI Edgelnsets ideUIScro IV iewOe legates

 

计算机生成了可选文字:UISc rollViewDelegatetDik — (void) scrollViewWi11BeginDragging: (UIScrollView scrollView; — (void) scrollViewDidScr011: (UIScrollView — (void) scrollViewDidEndDragging: (UIScrollView willDecelerate: (BODL)decelerate; Fiji* , UIScr011View ideUIScr011ViewDelegat& delegate

UIScrollView和控制器

一般情况下,就设置UIScrollView所在的控制器 为 UIScrollViewdelegate

 

设置控制器为UIScrollViewdelegate2种方法:

通过代码(self就是控制器)

self.Edison.delegate = self;

 

通过storyboard拖线(右击UIScrollView

计算机生成了可选文字:View Control Scroll View First Res Exit Scroll de gestu re Recogn

 

4.scrollView的代理方法

         scrollView 正在滚动的时候调用  偏移量一直变化

       - (void)scrollViewDidScroll:(UIScrollView*)scrollView;

         scrollView正在缩放

       - (void)scrollViewDidZoom:(UIScrollView*)scrollView

          开始拖拽的时候调用

       - (void)scrollViewWillBeginDragging:(UIScrollView*)scrollView;

         即将停止拖拽的时候调用

       - (void)scrollViewWillEndDragging:(UIScrollView*)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffsetNS_AVAILABLE_IOS(5_0);

         已经停止拖拽调用

       - (void)scrollViewDidEndDragging:(UIScrollView*)scrollView willDecelerate:(BOOL)decelerate;

         scrollView即将开始减速

       - (void)scrollViewWillBeginDecelerating:(UIScrollView*)scrollView;

         scrollView 停止减速  停止

       - (void)scrollViewDidEndDecelerating:(UIScrollView*)scrollView;

         scrollView 停止滚的的动画

       - (void)scrollViewDidEndScrollingAnimation:(UIScrollView*)scrollView;

         scrollView  哪些控件是需要缩放的

       - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;

         scrollView即将开始缩放

       - (void)scrollViewWillBeginZooming:(UIScrollView*)scrollView withView:(UIView *)view NS_AVAILABLE_IOS(3_2);

         scrollView结束缩放

       - (void)scrollViewDidEndZooming:(UIScrollView*)scrollView withView:(UIView *)view atScale:(CGFloat)scale;

         scrollView 即将滚动到顶部

       - (BOOL)scrollViewShouldScrollToTop:(UIScrollView*)scrollView;

         scrollView 已经滚动到顶部

       - (void)scrollViewDidScrollToTop:(UIScrollView*)scrollView;

 

UIScrollView和控制器

计算机生成了可选文字:• RE, EbJ#üEiFUIScr011ViewDe1egatetDi1 @interface MJViewController ( ) @property (weak, nonatomic) IBOutlet UllmageView *minionView; @property (weak, nonatomic) IBOutlet UIScrollView *scroUView; Cend

内容缩放

计算机生成了可选文字:内 容 缩 放 . 有 些 时 候 , 我 们 可 能 要 对 某 些 内 容 进 行 手 势 縮 放 , 如 下 图 所 示 UIS 。 r 。 11View 不 仅 能 滚 动 显 示 大 量 内 容 , 还 能 对 其 内 容 进 行 缩 放 处 理 也 就 是 说 , 要 完 成 縮 放 功 能 的 话 , 只 需 要 将 需 要 縮 放 的 内 容 添 加 到 UI ScrollView 中

 

计算机生成了可选文字:U 旧 cr 创 IView 的 缩 放 原 理 当 用 户 在 U 慫 cr , IView 身 上 使 用 捏 合 手 势 时 , 凵 Scro | IView 会 给 代 理 发 送 一 条 消 息 , 询 问 代 理 究 竞 要 缩 放 自 己 内 部 的 哪 一 个 子 控 件 ( 哪 一 块 内 容 ) UISC rollViewDeIegate 协 议 / / 用 户 使 用 捏 合 手 势 时 调 用 (UIView *)vieWForZoomingInScroUView:(IJIScroIlViei.' , scrolWi UIScr011View id•:UISc rollViewDeLegat» delegate 遵 1 实 现 相 应 的 方 法 代 理 对 象 当 用 户 在 Ulscr 。 11View 身 上 使 用 捏 合 手 势 时 , Ulscr011V1ew 会 调 用 代 理 的 viewForZoomingInScr011V1ew: 方 法 , 这 个 方 法 返 叵 的 控 件 是 需 要 进 行 縮 放 的 控 件

缩放实现步骤

跟缩放相关的其他代理方法

准备开始缩放的时候调用 

- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view

 

正在缩放的时候调用

- (void)scrollViewDidZoom:(UIScrollView*)scrollView

  

分页

只要将UIScrollViewpageEnabled属性设置为YESUIScrollView会被分割成多个独立页面,里面的内容就能进行分页展示

一般会配合UIPageControl增强分页效果,UIPageControl常用属性如下 

 

一共有多少页

@property(nonatomic)NSInteger numberOfPages;

当前显示第几页

@property(nonatomic) NSIntegercurrentPage; 

只有一页时,是否需要隐藏页码指示器

@property(nonatomic)BOOL hidesForSinglePage; 

其他页码指示器的颜色

@property(nonatomic,retain) UIColor*pageIndicatorTintColor;

当前页码指示器的颜色

@property(nonatomic,retain) UIColor*currentPageIndicatorTintColor;

 

NSTimer

注意:(它现在是弱指针,NSTimer的内部会有一个强指针引用着它)

NSTimer叫做定时器,它的作用如下

在指定的时间执行指定的任务

每隔一段时间执行指定的任务

调用下面的方法就会开启一个定时任务

+(NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTargetselector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;

每隔ti秒,调用一次aTargetaSelector方法,yes Or No决定了是否重复执行这个任务

通过invalidate方法可以停止定时器的工作,一旦定时器被停止了,就不能再次执行任务。只能再创建一个新的定时器才能执行新的任务

 

停止定时器:

- (void)invalidate;



 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值