1.描述
UIScrollView(滚动视图)
A view that allows the scrolling and zooming of its contained views.(一个可以允许滚动和缩放其包含的视图的视图)
class UIScrollView : UIView
UIScrollView是一些类比如:UITableView和UITextView)的父类.
滚动视图对象的核心理念是其原点是可以自适应其内容视图.它根据其frame进行裁剪内容,一般是跟应用程序的主窗口一样大小.滚动视图追踪手指移动和适应原点.视图通过滚动视图绘制它新的原点(偏移内容)来展示它的内容.滚动视图只绘制垂直和水平方向的滚动指示条,其他内容并不绘制.滚动视图必须知道内容视图的大小来保证其知道该何时停止滚动.默认情况下,它会反弹回来当视图超出了其边界的时候.
滚动视图对象管理者绘制展示拼接子视图的内容来保证没有视图会超出屏幕的大小.当用户滚动视图时候,滚动视图会进行必要的添加和移除子视图.
因为滚动视图没有滚动条,所以它必须知道通过滚动子视图从一个内容到另一个内容触摸标志的含义.为了达到这种目的,它需要通过开启一个定时器来暂时拦截一个触摸事件,在定时器结束前,来监听是否触摸的手指导致任何的移动.如果定时器没有在有意义的位置变化上失效,滚动视图则会发送一个轨迹追踪(track)事件给被触摸的子视图.如果用户接下来在定时器失效前进行了足够远的手指拖动,滚动视图就会取消所有的轨迹并且执行滚动.其子类可以重载touchesShouldBegin(_:with:in:),isPagingEnabled,touchesShouldCancel(in:)
方法来影响滚动视图如何处理滚动手势.
滚动视图还可以处理缩放和平移视图内容.当用户发动捏紧和外方手势,滚动视图就会适应内容的偏移量和缩放大小.当手势结束,管理内容视图的对象就会更新子视图内容.当手势正在进行,滚动视图则不会发送任何的轨迹追踪消息给子视图.
滚动视图对象可以有一个必须遵守UIScrollViewDelegate协议代理 .对于缩放和平移的操作,代理必须实现viewForZooming(in:),scrollViewDidEndZooming(:with:atScale:)
.必须注意最大缩放系数(maximumZoomScale)和最小缩放系数(minimumZoomScale)必须是不同的.
2.代码示例
//约束方式
myScrollView.backgroundColor = UIColor.green
let contentView = UIView()
contentView.backgroundColor = UIColor.systemBlue
myScrollView.addSubview(contentView)
self.view.addSubview(myScrollView)
myScrollView.translatesAutoresizingMaskIntoConstraints = false
let constrantArrayV = NSLayoutConstraint.constraints(withVisualFormat: "V:|-230-[myScrollView(200)]", options: NSLayoutConstraint.FormatOptions(), metrics: nil, views: ["myScrollView" : myScrollView,"superView":self.view!])
let constrantArrayH = NSLayoutConstraint.constraints(withVisualFormat: "H:|-0-[myScrollView(==superView)]-0-|", options: NSLayoutConstraint.FormatOptions(), metrics: nil, views: ["myScrollView" : myScrollView,"superView":self.view!])
self.view.addConstraints(constrantArrayV)
self.view.addConstraints(constrantArrayH)
contentView.translatesAutoresizingMaskIntoConstraints = false
let constrantArrayV1 = NSLayoutConstraint.constraints(withVisualFormat: "V:|-0-[contentView(1000)]-|", options: NSLayoutConstraint.FormatOptions(), metrics: nil, views: ["myScrollView" : myScrollView,"contentView":contentView])
let constrantArrayH1 = NSLayoutConstraint.constraints(withVisualFormat: "H:|-0-[contentView(==myScrollView)]-0-|", options: NSLayoutConstraint.FormatOptions(), metrics: nil, views: ["myScrollView" : myScrollView,"contentView":contentView])
myScrollView.addConstraints(constrantArrayV1)
myScrollView.addConstraints(constrantArrayH1)
//frame方式
myScrollView1.backgroundColor = UIColor.gray
myScrollView1.frame = CGRect.init(x: 0, y: 460, width: self.view.frame.width, height: 200)
myScrollView1.contentSize = CGSize.init(width: myScrollView1.frame.width, height: 600)
self.view.addSubview(myScrollView1)
self.contentView2.image = UIImage.init(named: "1")
myScrollView1.addSubview(contentView2)
contentView2.frame = CGRect.init(x: 0, y: 0, width: myScrollView1.contentSize.width, height: 200)
//内容视图的偏移量,负数是向右侧偏移
// myScrollView1.contentOffset = CGPoint.init(x: -20, y: -20)
//动画方式设置偏移量
// DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {
// self.myScrollView1.setContentOffset(CGPoint.init(x: -50, y: -50), animated: true)
// }
//滚动视图的内嵌偏移量
// print(myScrollView1.adjustedContentInset)
// myScrollView1.contentInset = UIEdgeInsets.init(top: 10, left: 10, bottom: 0, right: 0)
// myScrollView1.contentOffset = CGPoint.init(x: -10, y: -10)
// print(myScrollView1.adjustedContentInset)
//是否可以滚动
// myScrollView1.isScrollEnabled = false;
//是否锁定非垂直水平方向移动
// myScrollView1.isDirectionalLockEnabled = true
//是否是分页模式
// myScrollView1.isPagingEnabled = true
//是否支持滚动到顶部的手势
// self.myScrollView1.scrollsToTop = true
//是否支持滚动到边缘后有回弹效果
// self.myScrollView1.bounces = false
//即使垂直方向内容小于contentsize也会有回弹效果
// self.myScrollView1.alwaysBounceVertical = true;
//即使水平方向内容小于contentsize也会有回弹效果
// self.myScrollView1.alwaysBounceHorizontal = true;
//是否用户开始触摸视图,一般放于监听方法中
// print("self.myScrollView1.isTracking:\(self.myScrollView1.isTracking)")
// //是否用户开始拖动视图
// print("self.myScrollView1.isTracking:\(self.myScrollView1.isDragging)")
// //是否用户开始拖动结束视图并且正在减速回弹
// print("self.myScrollView1.isTracking:\(self.myScrollView1.isDecelerating)")
//
// //减速回弹的速度 normal和fast
// self.myScrollView1.decelerationRate = UIScrollView.DecelerationRate.fast
//滚动条颜色样式
// self.myScrollView1.indicatorStyle = UIScrollView.IndicatorStyle.white
// //是否显示垂直方向滚动条
// self.myScrollView1.showsVerticalScrollIndicator = false;
// //是否显示水平方向滚动条
// self.myScrollView1.showsHorizontalScrollIndicator = false;
//立即显示滚动条指示器
// self.myScrollView1.flashScrollIndicators()
//让滚动视图滚动到指定区域
// self.myScrollView1.scrollRectToVisible(CGRect.init(x: 0, y: 200, width: self.myScrollView1.frame.width, height: 200), animated: true)
//是否支持取消按压
// self.myScrollView1.canCancelContentTouches = false
//如果为true则需要判断出滚动意图才会调用方法touchesShouldBegin(_:with:in:),如果为false则会立即调用这个方法
// self.myScrollView1.delaysContentTouches = true
print("self.myScrollView1.directionalPressGestureRecognizer:\(self.myScrollView1.directionalPressGestureRecognizer)")
//最大放大系数
self.myScrollView1.maximumZoomScale = 3
//最小缩小系数
self.myScrollView1.minimumZoomScale = 1
self.myScrollView1.delegate = self;
- 工程下载地址:
https://github.com/DeveloperZhang/SwiftStudyDemo
3.总结
xx是一个最基础常见的视图类,可以参考文档进行深入学习:UIKit->Views and Controls-> UIScrollView