UIScrollView -滚动视图
来源:互联网 发布:windows7系统优化工具 编辑:程序博客网 时间:2024/06/08 11:21
概述
UIScrollView
(滚动视图)用于显示内容尺寸大于屏幕尺寸的视图。滚动视图有两个主要作用:
- 让用户通过拖拽手势来查看想看到的内容
- 通过捏合手势来放大或缩小查看的内容
滚动原理
在滚动过程当中,其实是在修改滚动内容的原点坐标。
当手指触摸后, scroll view会暂时拦截触摸事件,使用一个计时器, 假如在计时器到点后,没有发生手指移动事件,那么, scroll view发送tracking events到被点击的subview, 假如在计时器到点前,发生了移动事件, 那么 scroll view 取消tracking自己发生滚动。
子类可以重载touchesShouldBegin:withEvent:inContentView:
决定自己是否接收touch事件pagingEnable
d当值是true,会自动滚动到subview的边界,默认是false 。touchesShouldCancelInContentView:
开始发送tracking messages消息给subview的时候, 调用这个方法,决定是否发送tracking messages消息到subview, 假如返回false,发送, true则不发送
假如 canCancelContentTouches
属性是true,则不调用这个方法
来影响如何处理滚动手势
scroll view还处理缩放和平移手势要实现缩放和平移,必须实现委托`viewForZoomingInScrollView:
scrollViewDidEndZooming:withView:atScale:
两个方法,另外 maximumZoomScale
和minimumZoomScale
两个属性要不一样
属性及方法
内容显示相关
- setContentOffset(_:animated):是否以动画方式设置滚动内容的偏移量。
- contentOffSet:滚动内容原点相对于scroll view原点的偏移量(即:滚动内容的位置)默认为
CGPointZero
。 - contentSize:滚动内容区域的大小默认为
CGPointZero
,此属性必须设置。 - contentInset:在滚动视图的内容区域插入边距,大小默认为
UIEdgeInsetsZero
, 设置此属性可增大滚动范围。
管理滚动
scrollEnabled: Bool
-是否能滚动,默认为true。directionalLockEnabled: Bool
- 默认是 false,可以在垂直和水平方向同时运动。当值是 true 时,假如一开始是垂直或者是水平运动,那么接下来会锁定另外一个方向的滚动。 假如一开始是对角方向滚动,则不会禁止某个方向。scrollsToTop: Bool
-滚动到顶部的手势是否可用,默认为true,当用户点击顶部状态栏时,会滚动内容到顶部;如果设置为false,或则通过deletage
的方法:scrollViewShouldScrollToTop:
返回false,或者内容区域已经在顶部,那么将不会滚动。pagingEnabled: Bool
-是否启用分页,默认为false。如果设置为true,那么等滚动的时候讲义scroll view的bounds的倍数来进行。类似把图片分成了多个页。bounces: Bool
-是否有弹性效果,默认是 true,就是滚动超过边界会有反弹回来的效果。假如是 false,那么滚动到达边界会立刻停止。alwaysBounceVertical: Bool
-垂直方向是否一值有弹性效果,默认为false。如果设置为true,并且属性bounces
为true,那么当垂直拖拽内容,即使内容视图比scroll view的区域小,也会有弹性效果。alwaysBounceHorizontal: Bool
-水平方向是否一值有弹性效果,和上个属性对应。canCancelContentTouches: Bool
- 能取消内容触碰,默认为true。用于控制点击内容视图的时候是否会导致一直被追踪,当值是 true 的时候,用户触碰后,然后在一定时间内没有移动,scrollView 发送 tracking events,然后用户移动手指足够长度触发滚动事件,这个时候,scrollView 发送了touchesCancelled:withEvent:
(取消触碰事件) 到 subview,然后 scroView 开始滚动。假如值是 false,scrollView 发送 tracking events 后,就算用户移动手指,scrollView 也不会滚动。delaysContentTouches: Bool
-是否延迟处理触摸,当值是 true 的时候,用户触碰开始,scroll view要延迟一会,看看是否用户有意图滚动。假如滚动了,那么捕捉 touch-down 事件,否则就不捕捉。假如值是 false,当用户触碰, scroll view 会立即触发touchesShouldBegin:withEvent:inContentView:
,默认是 truedecelerationRate: CGFloat
-手指放开后的减速率,可用UIScrollViewDecelerationRateNormal
和UIScrollViewDecelerationRateFast
这两个常量。dragging: Bool { get }
- 是否正在拖拽,此属性只读。- tracking: Bool{ get }
-追踪,当touch(触摸)还没有拖动的时候为true,此属性只读。 decelerating: Bool { get }
-是否正在减速,当用户不在拖拽但是内容正在滚动的时候返回true,此属性只读 。- touchesShouldBegin:withEvent:inContentView:-如果不想让scroll view发送事件消息到内容视图,那么就返回false,否则范围true。
- - touchesShouldCancelInContentView(_:):-如果参数
view
为UIControl
则返回true, 否则返回false。 当scroll view 发送tracking消息事件到内容视图之后,就调用此方法,如果此方法返回false,那么它会停止传送触摸事件到内容视图的子视图。如果属性canCancelContentTouches
为false,那么scrollview不调用此方法。 - scrollRectToVisible:animated:-滚动内容视图的特定区域可见。
管理滚动指示器(即:滚动条)
indicatorStyle: UIScrollViewIndicatorStyle
- 指示器类型:三种分别为 .Default, .White, .Black。scrollIndicatorInsets: UIEdgeInsets
- 指示器边距:指示器相对于scroll view的边距。showsHorizontalScrollIndicator: Bool
- 是否显示水平滚动条。ishowsVerticalScrollIndicator: Bool
- 是否显示垂直滚动条。flashScrollIndicators()
- 刷新立马显示滚动条。
缩放与平移
panGestureRecognizer: UIPanGestureRecognizer { get }
- scrollview识别的平移手势,获得此手势用于更精确的控制,属性只读。pinchGestureRecognizer: UIPinchGestureRecognizer? { get }- scrollview识别的捏合手势,获得此手势用于更精确的控制,属性只读。
zoomScale: CGFloat
- 内容区域的当前缩放值,默认为1.0。minimumZoomScale: CGFloat
- 最小缩放值,默认为1.0不缩放。maximumZoomScale: CGFloat
- 最大缩放值,默认为1.0不缩放。zoomBouncing: Bool { get }
- 该值表示缩放已超过指定的缩放限制,当scroll view正在缩放回最小或最大缩放值时返回true,否则返回false。zooming: Bool { get }
-内容是否正在缩放。bouncesZoom: Bool
-缩放是否有弹性效果。setZoomScale(_:animated:)
-缩放是否有弹性效果。setZoomScale(_:animated:)
-动画放送缩放当前内容到指定值。
键盘管理
- keyboardDismissMode: UIScrollViewKeyboardDismissMode
-当拖动开始滚动时,键盘消失的方式,有三种.None
:(不消失),OnDrag
:(当拖拽开始的时候消失),Interactive
:(交互式:当拖拽的时候消失,但可用从下面再拉出来)。
代理(delegate)
delegate: UIScrollViewDelegate?-主要用于操作如滚动、缩放、滚动内容减速和滚动动画。
主要方法如下:
//只要滚动了就会触发func scrollViewDidScroll(scrollView: UIScrollView) { print("scrollViewDidScroll")}//开始拖拽视图func scrollViewWillBeginDragging(scrollView: UIScrollView) { print("scrollViewWillBeginDragging")}//将要结束拖拽视图func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) { print("scrollViewWillEndDragging")}//结束拖拽视图func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) { print("scrollViewDidEndDragging")}//将要减速时执行func scrollViewWillBeginDecelerating(scrollView: UIScrollView) { print("scrollViewWillBeginDecelerating")}//减速结束时执行func scrollViewDidEndDecelerating(scrollView: UIScrollView) { print("scrollViewDidEndDecelerating")}//滚动动画结束时执行func scrollViewDidEndScrollingAnimation(scrollView: UIScrollView) { print("scrollViewDidEndScrollingAnimation")}//如果滚轴视图不在顶部,你可以轻点状态栏,那个可视的滚轴视图会一直滚动到顶部,那是默认行为,你可以通过该方法返回false来关闭它func scrollViewShouldScrollToTop(scrollView: UIScrollView) -> Bool { return true}//滚动到顶部调用func scrollViewDidScrollToTop(scrollView: UIScrollView) { print("scrollViewDidScrollToTop")}//设置要缩放的视图,即: scrollview的subviewfunc viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? { return imageView}//缩放视图的动作开始时执行func scrollViewWillBeginZooming(scrollView: UIScrollView, withView view: UIView?) { print("scrollViewWillBeginZooming")}//缩放视图完成时执行,这时缩放动作还没结束,次方法在scrollViewDidEndZooming之前调用func scrollViewDidZoom(scrollView: UIScrollView) { print("scrollViewDidZoom")}//缩放视图的动作结束时执行func scrollViewDidEndZooming(scrollView: UIScrollView, withView view: UIView?, atScale scale: CGFloat) { print("scrollViewDidEndZooming")}
示例
直接看代码:
//// ViewController.swift// UIScrollViewDemo//// Created by fengsh on 16/3/17.// Copyright © 2016年 fengsh. All rights reserved.//import UIKitclass ViewController: UIViewController, UIScrollViewDelegate { @IBOutlet weak var scrollView: UIScrollView! //延迟加载,使用闭包来初始化属性 lazy var image: UIImage! = { let img = UIImage(named: "girl") return img }() var imageView: UIImageView! override func viewDidLoad() { super.viewDidLoad() imageView = UIImageView(image: image) scrollView.delegate = self //设置scrollView的滚动范围 scrollView.contentSize = CGSize(width:imageView.bounds.width , height: imageView.bounds.height) //在四周增加滚动范围 scrollView.contentInset = UIEdgeInsets(top: 20, left: 20, bottom: 20, right: 20) //内容相对于scrollView的坐标 scrollView.pagingEnabled = false //最大缩放3倍 scrollView.maximumZoomScale = 3.0 //最小缩放为原来的0.2倍 scrollView.minimumZoomScale = 0.2 //是否又弹性效果 scrollView.bounces = true //是否能滚动 scrollView.scrollEnabled = true //是否显示水平/垂直滚动条 scrollView.showsHorizontalScrollIndicator = false scrollView.showsVerticalScrollIndicator = false self.scrollView.addSubview(imageView) initTapGesture() } //添加点击手势,当双击的时候缩放视图到指定值 func initTapGesture() { let tapGesture = UITapGestureRecognizer(target: self, action: "scaleImage:") tapGesture.numberOfTapsRequired = 2 tapGesture.numberOfTouchesRequired = 1 self.view.addGestureRecognizer(tapGesture) } ...代理方法,见 代理(delegate)...}
- UIScrollView -滚动视图
- UIScrollView 滚动视图
- UIScrollView 滚动视图
- UIScrollView 滚动视图
- UIScrollView 滚动视图
- UIScrollView--滚动视图
- UIScrollView 滚动视图
- UIScrollView 滚动视图
- UI:UIScrollView滚动视图
- UIKit 滚动视图 UIScrollView
- iOS滚动视图UIScrollView
- 滚动视图UIScrollView、UIPageControl
- 滚动视图(UIScrollView)
- 《UIScrollView滚动视图》
- UIScrollView 滚动视图 (实例)
- UIScrollView 滚动视图 (实例)
- UIScrollView 滚动视图 (实例)
- UIScrollVIew 滚动视图内容总结
- jQuery存在的必要性
- codeforces-Good Bye 2015-New Year and Domino
- 二维映射成一维(1541)
- 文件链接读取程序
- 蓝桥杯 小朋友排队 (归并排序 逆序数 好题)
- UIScrollView -滚动视图
- android中xml tools属性详解
- 第四周项目3:猜数字游戏
- iOS如何给约束加动画?
- 循环嵌套三角形
- 软件测试用例自动生成技术(一)
- JSONP理解
- 常用STL库的整理
- STL源码剖析——序列容器之list