iOS开发 -UIScrollView详解

UIScrollView

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

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

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

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

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

UIScrollView的用法

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

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

UIScrollView无法滚动的解决办法

如果UIScrollView无法滚动,可能是以下原因:
1.没有设置contentSize
2.scrollEnabled = NO
3.没有接收到触摸事件:userInteractionEnabled = NO
4.没有取消autolayout功能(要想scrollView滚动,必须取消autolayout)

UIScrollView的代理(delegate)

很多时候,我们想在UIScrollView正在滚动 或 滚动到某个位置 或者 停止滚动 时做一些特定的操作
要想完成上述功能,前提条件就是能够监听到UIScrollView的整个滚动过程

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

也就是说,要想监听UIScrollView的滚动过程,就必须先给

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

UIScrollView和控制器

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

设置控制器为UIScrollView的delegate有2种方法:
通过代码(self就是控制器)
self.scrollView.delegate = self;

通过storyboard拖线(右击UIScrollView)

UIScrollView的常见属性

@property(nonatomic) CGPoint contentOffset;
//这个属性用来表示UIScrollView滚动的位置

@property(nonatomic) CGSize contentSize;
//这个属性用来表示UIScrollView内容的尺寸,滚动范围(能滚多远)

@property(nonatomic) UIEdgeInsets contentInset;
//这个属性能够在UIScrollView的4周增加额外的滚动区域

@property(nonatomic) BOOL bounces;
//设置UIScrollView是否需要弹簧效果

@property(nonatomic,getter=isScrollEnabled) BOOL scrollEnabled;
//设置UIScrollView是否能滚动

@property(nonatomic) BOOL showsHorizontalScrollIndicator;
//是否显示水平滚动条

@property(nonatomic) BOOL showsVerticalScrollIndicator;
//是否显示垂直滚动条

UIScrollView的常用代理方法


// 用户开始拖拽时调用
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;
// 滚动到某个位置时调用
- (void)scrollViewDidScroll:(UIScrollView *)scrollView;
// 用户结束拖拽时调用
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;

UIScrollView的缩放

当用户在UIScrollView身上使用捏合手势时,UIScrollView会给代理发送一条消息,询问代理究竟要缩放自己内部的哪一个子控件(哪一块内容)

1.实现UIScrollViewDelegate协议

// 用户使用捏合手势时调用
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;

遵守协议,实现相应的方法

id<UIScrollViewDelegate> delegate

当用户在UIScrollView身上使用捏合手势时,UIScrollView会调用代理的viewForZoomingInScrollView:方法,这个方法返回的控件就是需要进行缩放的控件

缩放实现步骤

设置UIScrollView的id<UISCrollViewDelegate> delegate代理对象
设置minimumZoomScale :缩小的最小比例
设置maximumZoomScale :放大的最大比例
让代理对象实现下面的方法,返回需要缩放的视图控件
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;

跟缩放相关的其他代理方法
缩放完毕的时候调用
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view

正在缩放的时候调用
- (void)scrollViewDidZoom:(UIScrollView *)scrollView

UIScrollView和UIPageControl的分页

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

一般会配合UIPageControl增强分页效果,UIPageControl常用属性如下
//一共有多少页
@property(nonatomic) NSInteger numberOfPages;

//当前显示的页码
@property(nonatomic) NSInteger currentPage; 

//只有一页时,是否需要隐藏页码指示器
@property(nonatomic) BOOL hidesForSinglePage; 

//其他页码指示器的颜色
@property(nonatomic,retain) UIColor *pageIndicatorTintColor;

//当前页码指示器的颜色
@property(nonatomic,retain) UIColor *currentPageIndicatorTintColor;

NSTimer的使用

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

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

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

调用下面的方法就会开启一个定时任务
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti                              target:(id)aTarget
                                selector:(SEL)aSelector
                                userInfo:(id)userInfo
                                repeats:(BOOL)yesOrNo;

每隔ti秒,调用一次aTarget的aSelector方法,yesOrNo决定了是否重复执行这个任务

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

- (void)invalidate;

UIScrollView实例

/**
 *
    1.成为代理的条件:
    UIScrollView将delegate需要实现的方法都定义在了UIScrollViewDelegate协议中,
    因此要想成为UIScrollView的delegate,必须遵守UIScrollViewDelegate协议,
    然后实现协议中相应的方法,就可以监听UIScrollView的滚动过程了

    2.设置UIScrollView的id<UISCrollViewDelegate> delegate代理对象
    设置minimumZoomScale :缩小的最小比例
    设置maximumZoomScale :放大的最大比例
    让代理对象实现下面的方法,返回需要缩放的视图控件
    - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;
 */

#import "ViewController.h"

@interface ViewController () <UIScrollViewDelegate>

@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@property (weak, nonatomic) IBOutlet UIImageView *minionView;

@end

//委托 代理模式

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //设置内容尺寸
    self.scrollView.contentSize=self.minionView.frame.size;
    //设置
    self.scrollView.delegate=self;

    //设置最大和最小的缩放比例
    self.scrollView.maximumZoomScale=2.0;
    self.scrollView.minimumZoomScale=0.2;
}

/**
 *  当用户开始拖拽scrollView时就会调用
 */
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    NSLog(@"开始拖拽....");
}

/**
 *  只要scrollView正在滚动,就会调用
 */
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    NSLog(@"正在滚动------%@",NSStringFromCGPoint(scrollView.contentOffset));
}

/**
 *  当用户使用捏合手势时就会调用
 *  @return 返回的控件就是需要进行缩放的控件
 */
- (UIView*)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    NSLog(@"开始缩放-----");
    return self.minionView;
}

- (void) scrollViewDidZoom:(UIScrollView *)scrollView
{
    NSLog(@"正在缩放----");
}
时间: 2024-07-30 02:28:06

iOS开发 -UIScrollView详解的相关文章

iOS开发:详解Objective-C runTime

Objective-C总Runtime的那点事儿(一)消息机制 最近在找工作,Objective-C中的Runtime是经常被问到的一个问题,几乎是面试大公司必问的一个问题.当然还有一些其他问题也几乎必问,例如:RunLoop,Block,内存管理等.其他的问题如果有机会我会在其他文章中介绍. 本篇文章主要介绍RunTime. RunTime简称运行时.就是系统在运行的时候的一些机制,其中最主要的是消息机制.对于C语言,函数的调用在编译的时候会决定调用哪个函数( C语言的函数调用请看这里 ).编

iOS开发 - UIActivityViewController详解

昨天在做微信分享的时候, 用到了这个东西.趁热写点东西记录下. UIActivityViewController类是一个标准的view controller,通个使用这个controller,你的应用程序就可以提供各种服务. 系统提供了一些通用的标准服务,例如拷贝内容至粘贴板.发布一个公告至社交网.通过email或者SMS发送内容. 应用程序同样可以自定义服务.(我的微信分享就属于自定义服务, 之后将会写一篇教程介绍) 你的应用程序负责配置.展现和解雇这个view controller. vie

IOS开发 Blocks详解(转)

IOS开发 Blocks详解(转) (2013-10-14 16:41:54) 从Mac OS X 10.6以及iOS 4开始,苹果在GCC和Clang编译器中为C语言引入了一个新扩展:Blocks,使得程序员可以在C.Objective-C.C++和Objective-C中使用闭包.Blocks有点像函数,但是它可以在其它函数或方法中进行声明和定义,同时它还是匿名的(匿名函数),并可以捕获其所在作用域中的变量(闭包特性). Blocks的语法 Blocks和C语言中的函数指针有点类似,如果你了

iOS开发- UICollectionView详解+实例

iOS开发- UICollectionView详解+实例 本章通过先总体介绍UICollectionView及其常用方法,再结合一个实例,了解如何使用UICollectionView. UICollectionView 和 UICollectionViewController 类是iOS6 新引进的API,用于展示集合视图,布局更加灵活,可实现多列布局,用法类似于UITableView 和 UITableViewController 类. 使用UICollectionView 必须实现UICol

iOS开发——MVC详解&amp;Swift+OC

MVC 设计模式 这两天认真研究了一下MVC设计模式,在iOS开发中这个算是重点中的重点了,如果对MVC模式不理解或者说不会用,那么你iOS肯定学不好,或者写不出好的东西,当然本人目前也在学习中,不过既然能看到这篇文档,说明你已经开始着手学习并且想深入研究它了,个人也是研究很久才搞懂,就写下来希望对各位有用,也能方便自己以后开发中查看,好了废话不多说,下面就来详细介绍一下MVC,并且用实例验证一下在项目开发中怎么去使用它. 相信你对 MVC 设计模式 并不陌生,只是不能完全理解其中的含义或者不能

IOS开发之----详解在IOS后台执行

文一 我从苹果文档中得知,一般的应用在进入后台的时候可以获取一定时间来运行相关任务,也就是说可以在后台运行一小段时间. 还有三种类型的可以运行在后以,1.音乐2.location 3.voip 文二 在IOS后台执行是本文要介绍的内容,大多数应用程序进入后台状态不久后转入暂停状态.在这种状态下,应用程序不执行任何代码,并有可能在任意时候从内存中删除.应用程序提供特定的服务,用户可以请求后台执行时间,以提供这些服务. 判断是否支持多线程 UIDevice* device = [UIDevice c

iOS开发--Bison详解连连支付集成简书

"最近由于公司项目需要集成连连支付,文档写的不是很清楚,遇到了一些坑,因此记录一下,希望能帮到有需要的人." 前面简单的集成没有遇到什么坑,在此整理一下官方的集成文档,具体步骤如下 导入文件 添加头文件引用 设置link标志Target->Build Setting ,Other Linker Flags 设置为 -all_load可能添加-all_load以后和其他库冲突,可以尝试使用 -force_load 单独load库, force_load后面跟的是 lib库的完整路径

iOS开发-NSURLSession详解

Core Foundation中NSURLConnection在2003年伴随着Safari浏览器的发行,诞生的时间比较久远,iOS升级比较快,AFNetWorking在3.0版本删除了所有基于NSURLConnection API的所有支持,新的API完全基于NSURLSession.AFNetworking 1.0建立在NSURLConnection的基础之上 ,AFNetworking 2.0使用NSURLConnection基础API,以及较新基于NSURLSession的API的选项.

iOS开发-Runtime详解(简书)

简介 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的.比如: [receiver message]; // 底层运行时会被编译器转化为: objc_msgSend(receiver, selector) // 如果其还有参数比如: [receiver message:(id)arg...]; // 底层运行时会被编译器转化为: objc_msgSend(receiver, selector, arg1,

iOS开发之详解正则表达式

本文由Charles翻自raywenderlich原文:NSRegularExpression Tutorial: Getting Started更新提示:本教程被James Frost更新到了iOS8和swift.Tutorial团队成员的Soheil Azarpour完成最初发布.正则表达式(广为所知的"regex")是一个字符串或一个字符序列来说明一种模式,把它作为一个搜索字符串-非常强大! 在一个文本编辑器或文字处理器中普通的旧式搜索只允许你进行简单的匹配.正则表达式可以实现这