如何使在Swift中使用UIScrollView进行滚动和缩放
使用iOS\Source\Cocoa Touch Class subclass模版创建一个新的文件。将类命明为CustomScrollViewController并将父类设置为UIViewController。确保“Also create XIB file”没有选中,语言使用Swift。 单击Next将文件保存到工程目录中。
打开CustomScrollViewController.swift替换为下面内容:
import UIKit
class CustomScrollViewController: UIViewController, UIScrollViewDelegate {
@IBOutlet var scrollView: UIScrollView!
}
打开Main.storyboard, 添加一个新的View Controller并和table的第二行通过push segue 进行连接。 将view controller的class修改成刚创建的CustomScrollViewController。
添加一个新的Scroll View并连接outlet和设置view controller作为它的delegate,就和上面的步骤一样。
然后, 打开CustomScrollViewController.swift并在你的scrollView outlet下面添加如下属性:
var containerView: UIView!
实现viewDidLoad方法.
override func viewDidLoad() {
super.viewDidLoad()
// 设置container view来保持你定制的视图层次
let containerSize = CGSize(width: 640.0, height: 640.0)
containerView = UIView(frame: CGRect(origin: CGPoint(x: 0, y: 0), size:containerSize))
scrollView.addSubview(containerView)
// 设置你定制的视图层次
let redView = UIView(frame: CGRect(x: 0, y: 0, width: 640, height: 80))
redView.backgroundColor = UIColor.redColor();
containerView.addSubview(redView)
let blueView = UIView(frame: CGRect(x: 0, y: 560, width: 640, height: 80))
blueView.backgroundColor = UIColor.blueColor();
containerView.addSubview(blueView)
let greenView = UIView(frame: CGRect(x: 160, y: 160, width: 320, height: 320))
greenView.backgroundColor = UIColor.greenColor();
containerView.addSubview(greenView)
let imageView = UIImageView(image: UIImage(named: "slow.png"))
imageView.center = CGPoint(x: 320, y: 320);
containerView.addSubview(imageView)
// 告诉scroll view内容的尺寸
scrollView.contentSize = containerSize;
// 设置最大和最小的缩放系数
let scrollViewFrame = scrollView.frame
let scaleWidth = scrollViewFrame.size.width / scrollView.contentSize.width
let scaleHeight = scrollViewFrame.size.height / scrollView.contentSize.height
let minScale = min(scaleWidth, scaleHeight)
scrollView.minimumZoomScale = minScale
scrollView.maximumZoomScale = 1.0
scrollView.zoomScale = 1.0
centerScrollViewContents()
}
viewDidLoad使用一个独立的根视图(root view)设置一个现实层级, 这个root view就是你的实例变量containerView。 然后你讲这个独立的视图添加到scroll view中。 这里就是关键所在 – 由于代理的回调viewForZoomingInScrollView只能返回一个视图,因此你只能想scroll view中添加一个视图。将zoomScale设置为1而不是minScale,这样内容视图就会在正常尺寸而不是适合屏幕的大小。
再次实现centerScrollViewContents和UIScrollViewDelegate的两个代理方法, 将原始版本中的imageView替换为containerView。
func centerScrollViewContents() {
let boundsSize = scrollView.bounds.size
var contentsFrame = containerView.frame
if contentsFrame.size.width < boundsSize.width {
contentsFrame.origin.x = (boundsSize.width - contentsFrame.size.width) / 2.0
} else {
contentsFrame.origin.x = 0.0
}
if contentsFrame.size.height < boundsSize.height {
contentsFrame.origin.y = (boundsSize.height - contentsFrame.size.height) / 2.0
} else {
contentsFrame.origin.y = 0.0
}
containerView.frame = contentsFrame
}
func viewForZoomingInScrollView(scrollView: UIScrollView!) -> UIView! {
return containerView
}
func scrollViewDidZoom(scrollView: UIScrollView!) {
centerScrollViewContents()
}
构建和运行工程。 这次选择Custom View Scroll,可以浏览和缩放手动创建的一个UIView场景!