UIScrollViewを使用するときにズームを一時的にオフにする方法を知っている人はいますか?
以下を使用してスクロールを無効にできることがわかりました。
self.scrollView.scrollEnabled = false;
しかし、ズームのための同様のコマンドは表示されません。何かご意見は?
ユーザーがジェスチャをズームする機能を無効にする場合は、iOS5以降でピンチジェスチャを無効にできます。これにより、コードからスクロールビューを制御できます...
_scrollView.pinchGestureRecognizer.enabled = NO;
_
パンについても同様です。
_scrollView.panGestureRecognizer.enabled = NO;
_
これは- (void)viewDidAppear:(BOOL)animated
以降で呼び出す必要があります。そうしないと、システムがリセットして有効にします。
Swift 4.x以降:
_imageZoomView.pinchGestureRecognizer?.isEnabled
_ = false/true
上記のfbreretoのアドバイスに従って、lockZoomとunlockZoomの2つの関数を作成しました。ズームをロックするときに、最大と最小のズームスケールを変数にコピーしてから、最大と最小のズームスケールを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;
}
設定minimumZoomScale
およびmaximumZoomScale
を確認してください。 ドキュメント によると:
ズームを有効にするには、
maximumZoomScale
がminimumZoomScale
より大きくなければなりません。
したがって、値を同じに設定すると、ズームが無効になります。
ここでは、scrollviewのズームを停止するための私の解決策です。
self.scrollView.minimumZoomScale=self.scrollView.maximumZoomScale;
これは本当に古い質問だと思いますが、目的に合わせて少し変更を加えました。
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;
func lockScrollViewZooming() {
scrollView.minimumZoomScale = 1.0
scrollView.minimumZoomScale = 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)
}
}
minimumZoomScale
のmaximumZoomScale
およびUIScrollView
プロパティを_1
_に設定するか、isMultipleTouchEnabled
のUIView
プロパティをfalse
またはnil
のviewForZooming(in:)
からUIScrollViewDelegate
を返しますが、何も機能しませんでした。私の場合、何度か試行錯誤した後、私の場合は次のように機能します[iOS10.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.pinchGestureRecognizer?.requireGestureRecognizerToFail(scrollView.panGestureRecognizer)