ios 在 UIScrollView 中关闭缩放
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1561521/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Turn off Zooming in UIScrollView
提问by CodingWithoutComments
Does anyone know a way to temporarily turn off zooming when using a UIScrollView?
有谁知道在使用 UIScrollView 时暂时关闭缩放的方法?
I see that you can disable scrolling using the following:
我看到您可以使用以下方法禁用滚动:
self.scrollView.scrollEnabled = false;
but I'm not seeing a similar command for zooming. Any thoughts?
但我没有看到类似的缩放命令。有什么想法吗?
回答by combinatorial
If you want to disable the user's ability to zoom through gestures then in iOS 5 and above you can disable the pinch gesture. This still allows you to control the scroll view from code...
如果您想禁用用户缩放手势的能力,那么在 iOS 5 及更高版本中,您可以禁用捏合手势。这仍然允许您从代码控制滚动视图...
scrollView.pinchGestureRecognizer.enabled = NO;
similarly for pan...
同样对于锅...
scrollView.panGestureRecognizer.enabled = NO;
This must be called in - (void)viewDidAppear:(BOOL)animated
or later as otherwise the system resets it to enabled.
这必须被调用- (void)viewDidAppear:(BOOL)animated
或稍后调用,否则系统会将其重置为启用。
Swift 4.x and above:
Swift 4.x 及更高版本:
imageZoomView.pinchGestureRecognizer?.isEnabled
= false/ true
imageZoomView.pinchGestureRecognizer?.isEnabled
=假/真
回答by CodingWithoutComments
Following fbrereto's advice above, I created two functions lockZoom and unlockZoom. When locking Zoom i copied my max and min zoom scales to variables then set the max and min zoom scale to 1.0. Unlocking zoom just reverses the process.
按照上面 fbrereto 的建议,我创建了两个函数 lockZoom 和 unlockZoom。锁定缩放时,我将最大和最小缩放比例复制到变量,然后将最大和最小缩放比例设置为 1.0。解锁缩放只是颠倒了这个过程。
-(void)lockZoom
{
maximumZoomScale = self.scrollView.maximumZoomScale;
minimumZoomScale = self.scrollView.minimumZoomScale;
self.scrollView.maximumZoomScale = 1.0;
self.scrollView.minimumZoomScale = 1.0;
}
-(void)unlockZoom
{
self.scrollView.maximumZoomScale = maximumZoomScale;
self.scrollView.minimumZoomScale = minimumZoomScale;
}
回答by derand
Also you can return "nil" as zooming view in UIScrollViewDelegate:
您也可以在 UIScrollViewDelegate 中返回“nil”作为缩放视图:
- (UIView *) viewForZoomingInScrollView:(UIScrollView *) scrollView
{
return canZoom?view:nil;
}
回答by fbrereto
Check setting minimumZoomScale
and maximumZoomScale
; According to the docs:
检查设置minimumZoomScale
和maximumZoomScale
;根据文档:
maximumZoomScale
must be greater thanminimumZoomScale
for zooming to be enabled.
maximumZoomScale
必须大于minimumZoomScale
才能启用缩放。
So, setting the values to be the same should disable zooming.
因此,将值设置为相同应该禁用缩放。
回答by yohannes
I have tried setting minimumZoomScale
and maximumZoomScale
properties of UIScrollView
to 1
or isMultipleTouchEnabled
property of UIView
to false
or return nil
from viewForZooming(in:)
of UIScrollViewDelegate
but none worked. In my case, after several trial and error, the following works in my case [Tested on iOS 10.3]:
我试过设置minimumZoomScale
和maximumZoomScale
属性UIScrollView
to1
或isMultipleTouchEnabled
属性UIView
tofalse
或 return nil
from viewForZooming(in:)
ofUIScrollViewDelegate
但没有奏效。就我而言,经过多次反复试验,以下在我的情况下有效[在 iOS 10.3 上测试]:
class MyViewController: UIViewController {
var webView: WKWebView?
override viewDidLoad() {
super.viewDidLoad()
//...
self.webView.scrollView.delegate = self
//...
}
}
extension MyViewController: UIScrollViewDelegate {
func scrollViewWillBeginZooming(_ scrollView: UIScrollView, with view: UIView?) {
scrollView.pinchGestureRecognizer?.isEnabled = false
}
}
回答by iChirag
here, my solution for stop zooming on scrollview.
在这里,我停止缩放滚动视图的解决方案。
self.scrollView.minimumZoomScale=self.scrollView.maximumZoomScale;
回答by Paul.s
I know this is a really old question but I made a slight variation for my purposes.
我知道这是一个非常古老的问题,但为了我的目的,我做了一些改动。
I wanted to be able to easily tell if the zooming was in fact enabled/disabled without relying on a comparison between scrollView.minimumZoomScale == scrollView.maximumZoomScale
, which could possibly not reflect whether zooming was actually enabled/disabled.
我希望能够在不依赖于 之间的比较的情况下轻松判断缩放是否实际上已启用/禁用scrollView.minimumZoomScale == scrollView.maximumZoomScale
,这可能无法反映缩放是否实际启用/禁用。
So I did this
所以我做了这个
// .h
@property (assign, nonatomic, getter=isZoomEnabled) BOOL zoomEnabled;
// .m
@synthesize zoomEnabled = _zoomEnabled;
- (void)setZoomEnabled:(BOOL)zoomEnabled;
{
_zoomEnabled = zoomEnabled;
UIScrollView *scrollView = self.scrollView;
if (zoomEnabled) {
scrollView.minimumZoomScale = self.minimumZoomScale;
scrollView.maximumZoomScale = self.maximumZoomScale;
} else {
scrollView.minimumZoomScale = 0.0f;
scrollView.maximumZoomScale = 0.0f;
}
}
The values for self.minimumZoomScale
and self.maximumZoomScale
are set at the time the UIScrollView
is configured.
对值self.minimumZoomScale
和self.maximumZoomScale
被设置在所述的时间UIScrollView
配置。
This gives me the ability to set/ask if zooming is enabled.
这使我能够设置/询问是否启用缩放。
myViewController.zoomEnabled = YES;
myViewController.isZoomEnabled;
回答by Ahmad F
Swift 3 Version:
斯威夫特 3 版本:
func lockScrollViewZooming() {
scrollView.minimumZoomScale = 1.0
scrollView.maximumZoomScale = 1.0
scrollView.bounces = false
scrollView.bouncesZoom = false
// Also, if you have double tap recognizer,
// remember to remove it
scrollView.removeGestureRecognizer(doubleTapGestureRecognizer)
}
func unlockScrollViewZooming() {
scrollView.minimumZoomScale = 1.0
scrollView.maximumZoomScale = 4.0
scrollView.bounces = true
scrollView.bouncesZoom = true
// Also, if you have double tap recognizer,
// remember to add it
scrollView.removeGestureRecognizer(doubleTapGestureRecognizer)
}
Note that doubleTapGestureRecognizer
should be an instance variable. It should be similar to:
注意doubleTapGestureRecognizer
应该是一个实例变量。它应该类似于:
private lazy var doubleTapGestureRecognizer: UITapGestureRecognizer = {
let doubleTapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleDoubleTap(_:)))
doubleTapGestureRecognizer.numberOfTapsRequired = 2
doubleTapGestureRecognizer.delegate = self
return doubleTapGestureRecognizer
}()
@objc private func handleDoubleTap(_ recognizer: UITapGestureRecognizer) {
//scrollView.setZoomScale((scrollView.zoomScale > scrollView.minimumZoomScale) ? scrollView.minimumZoomScale : scrollView.maximumZoomScale, animated: true)
if scrollView.zoomScale > scrollView.minimumZoomScale {
scrollView.setZoomScale(scrollView.minimumZoomScale, animated: true)
} else {
let touchLocation = recognizer.location(in: recognizer.view)
scrollView.zoom(to: CGRect(origin: touchLocation, size: CGSize(width: 22.0, height: 20.0)), animated: true)
}
}
回答by mmtootmm
If you want to disable only zooming with pinch gesture, below code does the trick.
如果您只想禁用捏合手势缩放,下面的代码可以解决问题。
scrollView.pinchGestureRecognizer?.requireGestureRecognizerToFail(scrollView.panGestureRecognizer)