[iOS基础控件 - 5.1] UIScrollView

A.需要掌握

UIScrollView 是一个能够滚动的视图控件,可以用来展示大量内容,如手机的“设置”

1.常见属性

2.常用代理方法

3.缩放

4.UIScrollView和UIPageControl的分页

5.NSTime的使用

B.UIScrollView概念与使用

练习:显示大图,以原始尺寸显示一张图片,可以滚动查看图片的各个部分

原图: 900 x 1305

1.拖入UIScrollView,加入一个ImageView,设置图片,设置图片尺寸

在controller中获取到scrollView和图片控件

2.使用代码设置UIScrollView的 contentSize 属性,这是用来设置滚动范围的

1     // 设置滚动范围,这里用图片实际大小
2     self.scrollView.contentSize = self.imageView.frame.size;

3.如果UIScrollView不能滚动,可能原因如下:

(1)没有设置contentSize

(2)scrollEnable = NO

(3)没有接收到触摸事件:userInteractionEnable = NO

(4)没有取消autolayout

拖动:

6.UIScrollView常见属性

1     // 表示滚动位置,相对于初始位置
2     @property(nonatomic)         CGPoint                      contentOffset;
3
4     // 表示尺寸、滚动范围
5     @property(nonatomic)         CGSize                       contentSize;
6
7     // 这个属性能够增加四周额外的滚动范围
8     @property(nonatomic)         UIEdgeInsets                 contentInset;

(1)各类位置、尺寸:

(2)额外边距 Insets

1     // 增加边距显示,参数分别是top, left, bottom, right
2     self.scrollView.contentInset = UIEdgeInsetsMake(10, 20, 40, 80);

    

(3)移动图片

1     // 移动到(200, 300)位置
2     self.scrollView.contentOffset = CGPointMake(200, 300);

7.其他属性

 1     // 是否需要弹簧效果
 2     @property(nonatomic)         BOOL                        bounces;
 3
 4     // 是否能够滚动
 5     @property(nonatomic,getter=isScrollEnabled) BOOL          scrollEnabled;
 6
 7     // 显示水平滚动条
 8     @property(nonatomic)         BOOL                        showsHorizontalScrollIndicator;
 9
10     // 显示垂直滚动条
11     @property(nonatomic)         BOOL                        showsVerticalScrollIndicator;

 

8.代理delegate

(1)用处:

监听思想:让一个对象A监听另一个对象B的状态

通知思想:一个对象B状态发生了改变,要通知对象A

这里A是B的代理,谁想监听,谁就是代理

(2)使用UIScrollView内部的delegate对象,监听事件,实现图片大小的不断转换

1 @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

1 #import <UIKit/UIKit.h>
2 @interface ViewController : UIViewController <UIScrollViewDelegate>
3 @end

b.指定UIScrollView的delegate

1 self.scrollView.delegate = self;

c.delegate实现方法

i.例如针对拖曳滚动的3个方法:

 1 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
 2      NSLog(@"开始拖曳");
 3 }
 4
 5 - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
 6     NSLog(@"正在拖曳");
 7 }
 8
 9 - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
10     NSLog(@"结束拖曳");
11 }

ii.针对手势缩放的3个方法

 1 - (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view {
 2     NSLog(@"开始缩放");
 3 }
 4
 5 - (void)scrollViewDidZoom:(UIScrollView *)scrollView {
 6     NSLog(@"正在缩放");
 7 }
 8
 9 - (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale {
10     NSLog(@"结束缩放");
11 }

iii.拖曳后的减速(2个方法)

1 - (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView {
2     NSLog(@"拖曳完成后减速开始");
3 }
4
5 - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
6     NSLog(@"拖曳完成后减速完成");
7 }

9.手势缩放

UIScrollView不仅能够滚动显示大量内容,还能对其内容进行缩放,所以只需要把要缩放的图片放到UIScrollView中。

一次只能缩放一个子控件,UIScrollView通过使用delegate调用手势方法,返回的就是指定要缩放的控件

1     // 捏合手势调用的方法
2     - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;

这个方法返回的就是需要进行缩放的控件

  • 设置minimumZoomScale:缩小的最小比例
  • 设置maximumZoomScale:放大的最大比例

实现步骤:

(1)实现手势调用方法

1 // 图片
2 @property (weak, nonatomic) IBOutlet UIImageView *imageView;
3
4 // 缩放手势调用的方法
5 - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
6     return self.imageView; // 需要放大的ImageView
7 }

(2)设置缩放比例

1     self.scrollView.maximumZoomScale = 2.0;
2     self.scrollView.minimumZoomScale = 0.1;

(3)效果

a.缩小

b.放大

10.分页

例子就是桌面的APP列表,当APP数量超过一个屏幕,自动进行分页

设置属性pageEnable = YES,UIScrollView会被分割成多个独立页面,进行分页显示

一般使用UIPageControl增强效果,UIPageControl常见属性:

 1     // 总页数
 2     @property(nonatomic) NSInteger numberOfPages;          // default is 0
 3     // 当前页码
 4     @property(nonatomic) NSInteger currentPage;
 5     // 只有一页的时候隐藏页码
 6     @property(nonatomic) BOOL hidesForSinglePage;          // hide the the indicator if there is only one page. default is NO
 7     // 其他页码指示颜色
 8     @property(nonatomic,retain) UIColor *pageIndicatorTintColor;
 9     // 当前页码指示颜色
10     @property(nonatomic,retain) UIColor *currentPageIndicatorTintColor;

11.NSTimer

定时器,功能:

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

(1)调用以下方法开启定时任务,然后调用 fire 方法执行:

1 + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;
2
3 - (void)fire;

每间隔ti秒执行一次aSelector方法,yesOrNo是否重复执行

(2)调用一下方法创建NSTimer,不用调用 fire 就会运行

1 + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo;

(3)通过invalidate方法可以停止定时器的工作,但是不能再次执行,只能再重新创建一个新的定时器

1     // 永久终止工作
2     - (void)invalidate;

另外有两个类可以做定时任务:

  • NSTimer:适合时间间隔比较大
  • CADisplayLink:适合频率比较高,做游戏动画用

(4)定时器在单线程下存在的问题

UI界面只能使用主线程刷新,如果使用阻断手段(例如定时器触发画面滑动,但是可以手动干扰画面移动),干扰定时器的运行,就会阻止定时器的事件触发,被阻止的事件累积之后会在线程资源得到解放之后触发。

解决:当出现阻断手段阻止了定时器触发的时候,回收定时器,等得到线程资源之后再重新创建定时器。

时间: 2024-10-25 23:19:23

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

iOS基础控件UINavigationController中的传值

iOS基础控件UINavigationController中的传值,代理传值,正向传值,反向传值 #import <UIKit/UIKit.h> //声明一个协议 @protocol SendValue<NSObject> //定义一个方法 - (void)sendBtnTitle:(NSString *)title; @end @interface FirstViewController : UIViewController // 定义代理 @property (nonatomi

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

A.概述 在"[iOS基础控件 - 4.4] APP列表 进一步封装,初见MVC模式”上进一步改进,给“下载”按钮加上效果.功能 1.按钮点击后,显示为“已下载”,并且不可以再按 2.在屏幕中间弹出一个消息框,通知消息“xx已经被安装”,慢慢消失 3.消息框样式为圆角半透明 B.不使用代理模式,使用app空间组和主View之间的父子View关系 1.在主View中创建一个消息框 主View控制器:ViewController.m 1 // 创建下载成功消息框 2 CGFloat labelWid

ios基础控件之开关按钮(UISwitch)

UISwitch控件是iOS开发的基础控件,是非常简单的一个控件,因为它的方法比较少.UISwitch继承于UIControl基类,因此可以当成活动控件使用. 注意:开关状态通过它的on属性进行读取,该属性是一个BOOL属性 创建: UISwitch* mySwitch = [[ UISwitch alloc]initWithFrame:CGRectMake(0.150.0f,100.0f,0.0f,0.0f)]; 可能你会疑问为什么它的大小都设置为0?没错,它的大小你设置是无效的,系统会为你分

ios基础控件之UITextView

多行文本控件UITextView继承UIScrollView:UIView控件,默认是带有滚动条的.UITextView和UITextField都是文本编辑.显示控件,它们功能和行为在很多方面都是相似的. UITextView与UITextField的区别主要在以下三点: UITextView是一个多行文本框,而UITextField只是单行文本框. UITextView没有继承UIControl控件,因此不能绑定IBAction事件处理 方法:也不能调用UIControl提供的addTarge

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

原图: 900 x 1305   拖曳滚动: 缩放:       主要代码: 1 // 2 // ViewController.m 3 // ImageZoom 4 // 5 // Created by hellovoidworld on 14/11/28. 6 // Copyright (c) 2014年 hellovoidworld. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 11 @interface

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

A.概念 例子就是桌面的APP列表,当APP数量超过一个屏幕,自动进行分页 B.实现思路 1.创建一个UIScrollView,这里设置为宽度跟屏幕相同,高度1/4屏幕高度左右 2.使用代码在UIScrollView中添加ImageView,横向放入多张ImageView 3.设置UIScrollView的contentSize为所有图片的宽度总和 4.要保证UIScrollView的宽度等于一张ImageView的宽度,才能正确分页 C.相关属性 设置属性pageEnable = YES,UI

iOS基础控件之 UIScrollView

A.需要掌握 UIScrollView 是一个能够滚动的视图控件,可以用来展示大量内容,如手机的“设置” 1.常见属性 2.常用代理方法 3.缩放 4.UIScrollView和UIPageControl的分页 5.NSTime的使用 B.UIScrollView概念与使用 练习:显示大图,以原始尺寸显示一张图片,可以滚动查看图片的各个部分 原图: 900 x 1305 1.拖入UIScrollView,加入一个ImageView,设置图片,设置图片尺寸 在controller中获取到scrol

iOS 基础控件(下)

上篇介绍了UIButton.UILabel.UIImageView和UITextField,这篇就简短一点介绍UIScrollView和UIAlertView. UIScrollView 顾名思义也知道这个是和滚动相关的控件,在Android开发时遇到过ScrollView,当内容的尺寸超出了屏幕范围之后,用ScrollView则可以通过滚动的方式使得超出屏幕的那部分内容通过滚动的方式显示出来,在Android里面有水平的ScrollView和垂直的ScrollView,在iOS里面就只有一个S

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

A.需求 做出一个类似于QQ.微信的聊天界面 1.每个cell包含发送时间.发送人(头像).发送信息 2.使用对方头像放在左边,我方头像在右边 3.对方信息使用白色背景对话框,我方信息使用蓝色背景对话框 4.隐藏相同的发送时间 5.底部功能按钮:语音按钮.消息输入框.表情按钮.附加按钮 6.响应键盘事件,呼出键盘.隐藏键盘时对上述的视图作出上移操作 7.键盘的发送事件处理 B.实现点 1.底层视图搭建 上部分聊天信息框:UITableView 下部分功能区:UIButton 信息输入框使用无边框