如何启用 UIScrollView
中的缩放功能?
所以:滚动视图(UIScrollView)还处理内容的缩放和拖动。当用户进行捏合手势时,滚动视图会调整内容的偏移量和缩放比例。手势结束时,管理内容视图的对象应根据需要更新内容的子视图。(请注意,手势可以结束但某个手指仍然按下。)在手势进行中,滚动视图不会向子视图发送任何跟踪调用。
UIScrollView类可以有一个必须采用UIScrollViewDelegate协议的委托。为了使缩放和拖动功能正常工作,必须实现委托方法:viewForZoomingInScrollView: 和 scrollViewDidEndZooming:withView:atScale:。此外,最大(maximumZoomScale)和最小(minimumZoomScale)缩放比例必须不同。
UIScrollViewDelegate
协议并设置为你的UIScrollView
实例的delegate
的委托对象。viewForZoomingInScrollView:
(该方法必须返回你要缩放的内容视图)。你也可以选择性地实现scrollViewDidEndZooming:withView:atScale:
方法。UIScrollView
实例上,你必须将minimumZoomScale
和maximumZoomScale
设置为不同的值(默认值为1.0)。viewForZooming...
方法中返回nil
是否就足够了呢?虽然这确实可以禁用缩放,但是某些手势(对于两个手指)可能会出现问题。因此,为了禁用缩放,你应该将最小和最大缩放比例都设置为1.0。override func viewDidLoad() {
super.viewDidLoad()
// 1
let image = UIImage(named: "photo1.png")!
imageView = UIImageView(image: image)
imageView.frame = CGRect(origin: CGPoint(x: 0, y: 0), size:image.size)
scrollView.addSubview(imageView)
// 2
scrollView.contentSize = image.size
// 3
var doubleTapRecognizer = UITapGestureRecognizer(target: self, action: "scrollViewDoubleTapped:")
doubleTapRecognizer.numberOfTapsRequired = 2
doubleTapRecognizer.numberOfTouchesRequired = 1
scrollView.addGestureRecognizer(doubleTapRecognizer)
// 4
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;
// 5
scrollView.maximumZoomScale = 1.0
scrollView.zoomScale = minScale;
// 6
centerScrollViewContents()
}
func centerScrollViewContents() {
let boundsSize = scrollView.bounds.size
var contentsFrame = imageView.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
}
imageView.frame = contentsFrame
}
func scrollViewDoubleTapped(recognizer: UITapGestureRecognizer) {
// 1
let pointInView = recognizer.locationInView(imageView)
// 2
var newZoomScale = scrollView.zoomScale * 1.5
newZoomScale = min(newZoomScale, scrollView.maximumZoomScale)
// 3
let scrollViewSize = scrollView.bounds.size
let w = scrollViewSize.width / newZoomScale
let h = scrollViewSize.height / newZoomScale
let x = pointInView.x - (w / 2.0)
let y = pointInView.y - (h / 2.0)
let rectToZoomTo = CGRectMake(x, y, w, h);
// 4
scrollView.zoomToRect(rectToZoomTo, animated: true)
}
请确保您将viewController设置为scrollViews的代理并实现以下方法:
func viewForZooming(in scrollView: UIScrollView) -> UIView? {
return imageView
}
我认为这并不适用于 iOS 5.0 和 Xcode 4.3+。我在这里寻找相似的东西,我发现这是针对图像的,但它可能会有所帮助。