【发布时间】:2010-12-06 09:36:05
【问题描述】:
有谁知道在使用 UIScrollView 时暂时关闭缩放的方法?
我发现您可以使用以下方法禁用滚动:
self.scrollView.scrollEnabled = false;
但我没有看到类似的缩放命令。有什么想法吗?
【问题讨论】:
标签: ios iphone uiscrollview zooming
有谁知道在使用 UIScrollView 时暂时关闭缩放的方法?
我发现您可以使用以下方法禁用滚动:
self.scrollView.scrollEnabled = false;
但我没有看到类似的缩放命令。有什么想法吗?
【问题讨论】:
标签: ios iphone uiscrollview zooming
如果您想禁用用户缩放手势的功能,那么在 iOS 5 及更高版本中,您可以禁用捏合手势。这仍然允许您从代码中控制滚动视图...
scrollView.pinchGestureRecognizer.enabled = NO;
对于泛...
scrollView.panGestureRecognizer.enabled = NO;
这必须在- (void)viewDidAppear:(BOOL)animated 或更高版本中调用,否则系统会将其重置为启用。
Swift 4.x 及更高版本:
imageZoomView.pinchGestureRecognizer?.isEnabled = false / true
【讨论】:
scrollView.pinchGestureRecognizer.enabled = NO; 后,缩放仍然有效?
self.pinchGestureRecognizer.enabled = false(和另一个)可以在 -(void)didMoveToWindow 中调用。
按照上面 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;
}
【讨论】:
您还可以在 UIScrollViewDelegate 中将“nil”作为缩放视图返回:
- (UIView *) viewForZoomingInScrollView:(UIScrollView *) scrollView
{
return canZoom?view:nil;
}
【讨论】:
scrollEnabled 设置为NO 后,UIKit 会自动将我的滚动视图缩小到zoomScale 1.0
scrollView.zoomScale时,这个方法被调用,它返回nil,结果返回1.0作为你滚动视图的zoomScale
检查设置minimumZoomScale和maximumZoomScale;根据the docs:
maximumZoomScale必须大于minimumZoomScale才能启用缩放。
因此,将值设置为相同应该禁用缩放。
【讨论】:
我尝试将UIScrollView 的minimumZoomScale 和maximumZoomScale 属性设置为1 或isMultipleTouchEnabled 属性UIView 到false 或从viewForZooming(in:) 的false 返回nil没有工作。在我的情况下,经过多次试验和错误,以下在我的情况下有效 [在 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
}
}
【讨论】:
我知道这是一个很老的问题,但为了我的目的,我做了些许改动。
我希望能够轻松判断缩放实际上是否启用/禁用,而不依赖于 scrollView.minimumZoomScale == scrollView.maximumZoomScale 之间的比较,这可能无法反映缩放是否实际启用/禁用。
所以我这样做了
// .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;
}
}
self.minimumZoomScale 和 self.maximumZoomScale 的值是在配置 UIScrollView 时设置的。
这使我能够设置/询问是否启用缩放。
myViewController.zoomEnabled = YES;
myViewController.isZoomEnabled;
【讨论】:
这里是我停止缩放滚动视图的解决方案。
self.scrollView.minimumZoomScale=self.scrollView.maximumZoomScale;
【讨论】:
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)
}
注意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)
}
}
【讨论】:
如果您只想通过捏合手势禁用缩放,下面的代码可以解决问题。
scrollView.pinchGestureRecognizer?.requireGestureRecognizerToFail(scrollView.panGestureRecognizer)
【讨论】:
您需要关闭滚动视图的两指和双击
self.scrollView.delegate = self
和
extension YourViewController: UIScrollViewDelegate {
func scrollViewWillBeginZooming(_ scrollView: UIScrollView, with view: UIView?) {
scrollView.pinchGestureRecognizer?.isEnabled = false
}
func viewForZooming(in scrollView: UIScrollView) -> UIView? {
return nil
}
}
【讨论】: