A.需要掌握
UIScrollView 是一个能够滚动的视图控件,可以用来展示大量内容,如手机的“设置”
1.常见属性
2.常用代理方法
3.缩放
4.UIScrollView和UIPageControl的分页
5.NSTime的使用
 
B.UIScrollView概念与使用
练习:显示大图,以原始尺寸显示一张图片,可以滚动查看图片的各个部分
 
原图: 900 x 1305
 
1.拖入UIScrollView,加入一个ImageView,设置图片,设置图片尺寸
 
在controller中获取到scrollView和图片控件
 
2.使用代码设置UIScrollView的 contentSize 属性,这是用来设置滚动范围的
     // 设置滚动范围,这里用图片实际大小
self.scrollView.contentSize = self.imageView.frame.size;
 
3.如果UIScrollView不能滚动,可能原因如下:
(1)没有设置contentSize
(2)scrollEnable = NO
(3)没有接收到触摸事件:userInteractionEnable = NO
(4)没有取消autolayout
 
拖动:
 
 
6.UIScrollView常见属性
     // 表示滚动位置,相对于初始位置
@property(nonatomic) CGPoint contentOffset; // 表示尺寸、滚动范围
@property(nonatomic) CGSize contentSize; // 这个属性能够增加四周额外的滚动范围
@property(nonatomic) UIEdgeInsets contentInset;
 
(1)各类位置、尺寸:
 
(2)额外边距 Insets
     // 增加边距显示,参数分别是top, left, bottom, right
self.scrollView.contentInset = UIEdgeInsetsMake(, , , );
 
    
 
 
(3)移动图片
     // 移动到(200, 300)位置
self.scrollView.contentOffset = CGPointMake(, );
 
 
 
7.其他属性
     // 是否需要弹簧效果
@property(nonatomic) BOOL bounces; // 是否能够滚动
@property(nonatomic,getter=isScrollEnabled) BOOL scrollEnabled; // 显示水平滚动条
@property(nonatomic) BOOL showsHorizontalScrollIndicator; // 显示垂直滚动条
@property(nonatomic) BOOL showsVerticalScrollIndicator;
 
8.代理delegate
(1)用处:
监听思想:让一个对象A监听另一个对象B的状态
通知思想:一个对象B状态发生了改变,要通知对象A
这里A是B的代理,谁想监听,谁就是代理
 
(2)使用UIScrollView内部的delegate对象,监听事件,实现图片大小的不断转换
 @property(nonatomic,assign) id<UIScrollViewDelegate>      delegate; // default nil. weak reference
 
(3)UIScrollView的代理(delegate)的任务:
  • 设置UIScrollView在滚动过程某个特定位置、事件做一些特定的操作
  • 必须监听整个滚动过程
  • 发生滚动时,发送消息(调用方法)代理(delegate)对象
  • 所以需要给UIScrollView设置一个delegate成员
 
所以要称为UIScrollView的delegate必须实现以上方法,这些方法声明在了UIScrollViewDelegate协议中,即要成为UIScrollView的delegate,必须遵守UIScrollViewDelegate协议。
 
(4)设置delegate三步骤:
a.直接使用当前控制器作为delegate
 #import <UIKit/UIKit.h>
@interface ViewController : UIViewController <UIScrollViewDelegate>
@end
 
b.指定UIScrollView的delegate
 self.scrollView.delegate = self;
 
c.delegate实现方法
 
i.例如针对拖曳滚动的3个方法:
 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
NSLog(@"开始拖曳");
} - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
NSLog(@"正在拖曳");
} - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
NSLog(@"结束拖曳");
}
 
ii.针对手势缩放的3个方法
 - (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view {
NSLog(@"开始缩放");
} - (void)scrollViewDidZoom:(UIScrollView *)scrollView {
NSLog(@"正在缩放");
} - (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale {
NSLog(@"结束缩放");
}
 
iii.拖曳后的减速(2个方法)
 - (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView {
NSLog(@"拖曳完成后减速开始");
} - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
NSLog(@"拖曳完成后减速完成");
}
 
9.手势缩放
UIScrollView不仅能够滚动显示大量内容,还能对其内容进行缩放,所以只需要把要缩放的图片放到UIScrollView中。
一次只能缩放一个子控件,UIScrollView通过使用delegate调用手势方法,返回的就是指定要缩放的控件
     // 捏合手势调用的方法
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;
 
这个方法返回的就是需要进行缩放的控件
  • 设置minimumZoomScale:缩小的最小比例
  • 设置maximumZoomScale:放大的最大比例
 
实现步骤:
(1)实现手势调用方法
 // 图片
@property (weak, nonatomic) IBOutlet UIImageView *imageView; // 缩放手势调用的方法
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
return self.imageView; // 需要放大的ImageView
}
(2)设置缩放比例
     self.scrollView.maximumZoomScale = 2.0;
self.scrollView.minimumZoomScale = 0.1;
 
(3)效果
a.缩小
b.放大
 
 
10.分页
例子就是桌面的APP列表,当APP数量超过一个屏幕,自动进行分页
 
设置属性pageEnable = YES,UIScrollView会被分割成多个独立页面,进行分页显示
一般使用UIPageControl增强效果,UIPageControl常见属性:
     // 总页数
@property(nonatomic) NSInteger numberOfPages; // default is 0
// 当前页码
@property(nonatomic) NSInteger currentPage;
// 只有一页的时候隐藏页码
@property(nonatomic) BOOL hidesForSinglePage; // hide the the indicator if there is only one page. default is NO
// 其他页码指示颜色
@property(nonatomic,retain) UIColor *pageIndicatorTintColor;
// 当前页码指示颜色
@property(nonatomic,retain) UIColor *currentPageIndicatorTintColor;
 
11.NSTimer
定时器,功能:
  • 在指定的时间执行指定的任务
  • 每隔一段时间执行指定的任务
 
(1)调用以下方法开启定时任务,然后调用 fire 方法执行:
 + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;

 - (void)fire;
 
每间隔ti秒执行一次aSelector方法,yesOrNo是否重复执行
 
(2)调用一下方法创建NSTimer,不用调用 fire 就会运行
 + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo;
 
(3)通过invalidate方法可以停止定时器的工作,但是不能再次执行,只能再重新创建一个新的定时器
     // 永久终止工作
- (void)invalidate;
 
另外有两个类可以做定时任务:
  • NSTimer:适合时间间隔比较大
  • CADisplayLink:适合频率比较高,做游戏动画用
 
 
(4)定时器在单线程下存在的问题
     UI界面只能使用主线程刷新,如果使用阻断手段(例如定时器触发画面滑动,但是可以手动干扰画面移动),干扰定时器的运行,就会阻止定时器的事件触发,被阻止的事件累积之后会在线程资源得到解放之后触发。
    
解决:当出现阻断手段阻止了定时器触发的时候,回收定时器,等得到线程资源之后再重新创建定时器。

[iOS基础控件 - 5.1] UIScrollView的更多相关文章

  1. [iOS基础控件 - 5.5] 代理设计模式 (基于”APP列表"练习)

    A.概述      在"[iOS基础控件 - 4.4] APP列表 进一步封装,初见MVC模式”上进一步改进,给“下载”按钮加上效果.功能      1.按钮点击后,显示为“已下载”,并且不 ...

  2. [iOS基础控件 - 5.4] 广告分页代码(UIScrollView制作)

    A.概念 例子就是桌面的APP列表,当APP数量超过一个屏幕,自动进行分页   B.实现思路 1.创建一个UIScrollView,这里设置为宽度跟屏幕相同,高度1/4屏幕高度左右 2.使用代码在UI ...

  3. [iOS基础控件 - 5.2] 查看大图、缩放图片代码(UIScrollView制作)

    原图: 900 x 1305      拖曳滚动:   缩放:           主要代码: // // ViewController.m // ImageZoom // // Created by ...

  4. iOS 基础控件(下)

    上篇介绍了UIButton.UILabel.UIImageView和UITextField,这篇就简短一点介绍UIScrollView和UIAlertView. UIScrollView 顾名思义也知 ...

  5. [iOS基础控件 - 6.9] 聊天界面Demo

    A.需求 做出一个类似于QQ.微信的聊天界面 1.每个cell包含发送时间.发送人(头像).发送信息 2.使用对方头像放在左边,我方头像在右边 3.对方信息使用白色背景对话框,我方信息使用蓝色背景对话 ...

  6. [iOS基础控件 - 7.0] UIWebView

    A.基本使用 1.概念 iOS内置的浏览器控件 Safari浏览器就是通过UIWebView实现的   2.用途:制作简易浏览器 (1)基本请求 创建请求 加载请求 (2)代理监听webView加载, ...

  7. [iOS基础控件 - 6.11.3] 私人通讯录Demo 控制器的数据传递、存储

    A.需求 1.搭建一个"私人通讯录"Demo 2.模拟登陆界面 账号 密码 记住密码开关 自动登陆开关 登陆按钮 3.退出注销 4.增删改查 5.恢复数据(取消修改)   这个代码 ...

  8. [iOS基础控件 - 6.10.2] PickerView 自定义row内容 国家选择Demo

    A.需求 1.自定义一个UIView和xib,包含国家名和国旗显示 2.学习row的重用   B.实现步骤 1.准备plist文件和国旗图片     2.创建模型 // // Flag.h // Co ...

  9. [iOS基础控件 - 6.9.1] 聊天界面Demo 代码

    框架:   所有代码文件:   Model: // // Message.h // QQChatDemo // // Created by hellovoidworld on 14/12/8. // ...

随机推荐

  1. 使用Data Annotations进行手动数据验证

    Data Annotations是在Asp.Net中用于表单验证的 它通过Attribute直接标记字段的有效性,简单且直观.在非Asp.Net程序中(如控制台程序),我们也可以使用Data Anno ...

  2. codeforces #305 D Mike and Fish

    正解貌似是大暴搜? 首先我们考虑这是一个二分图,建立网络流模型后很容易得出一个算法 S->行 容量为Num[X]/2; 行->列 容量为1 且要求(x,y)这个点存在 列->T 容量 ...

  3. 启动 Eclipse 弹出“Failed to load the JNI shared library jvm.dll”错误的解决方法!

    启动 Eclipse 弹出"Failed to load the JNI shared library jvm.dll"错误的解决方法 http://blog.csdn.net/z ...

  4. Android invalidate()自动清屏,屏幕刷新

    invalidate()是用来刷新View的,必须是在UI线程中进行工作.比如在修改某个view的显示时,调用invalidate()才能看到重新绘制的界面.invalidate()的调用是把之前的旧 ...

  5. 新版本的tlplayer for android ,TigerLeapMC for windows发布了

    tlplayer for android 新版本修正了图像倾斜等等问题,增加了动态水印功能. 支持hls(m3u8),http,rtsp,mms,rtmp等网络协议. 声明tlplayer 上的变速不 ...

  6. R12 - OM改进了对成本与收入确认的流程

    我们知道在企业经营活动中,根据财务制度的要求,对于收入与成本确认有很复杂的原则,这里就不去细讨论这些原则了,要了解的话可以看纵横四海的BLOG: 中也有,但11中是灰的. 这个科目什么时候发挥作用呢? ...

  7. gdb调试SAPI方式的php

    一.修改php-fpm.conf文件 /usr/local/php/etc/php-fpm.conf pm.max_children = 1 #只产生一个进程,便于追踪 二.得到进行服务的进程号 [r ...

  8. .net 测试工具类

    fluentassertions QuickStart  (替换Assert ) https://github.com/dennisdoomen/fluentassertions/wiki   Moq ...

  9. 各种好用的工具之一 ---- PNGGauntlet

    1.PNGGauntlet实际上是一个图形前端,压缩图像的过程中使用的是PNGOUT, OptiPNG, 和DeflOpt这三款软件. 软件官网:http://pnggauntlet.com/ 可自行 ...

  10. Hibernate配置文件解释

    Hibernate配置文件主要用于配置数据库连接和Hibernate运行时所需的各种属性每个Hibernate配置文件对应一个Configuration对象Hibernate配置文件可以有两种格式: ...