[英]Turn off Zooming in UIScrollView
有誰知道在使用 UIScrollView 時暫時關閉縮放的方法?
我看到您可以使用以下方法禁用滾動:
self.scrollView.scrollEnabled = false;
但我沒有看到類似的縮放命令。 有什么想法嗎?
如果您想禁用用戶縮放手勢的能力,那么在 iOS 5 及更高版本中,您可以禁用捏合手勢。 這仍然允許您從代碼控制滾動視圖...
scrollView.pinchGestureRecognizer.enabled = NO;
同樣對於鍋...
scrollView.panGestureRecognizer.enabled = NO;
這必須在- (void)viewDidAppear:(BOOL)animated
或以后調用,否則系統會將其重置為啟用。
Swift 4.x 及更高版本:
imageZoomView.pinchGestureRecognizer?.isEnabled
= false / true
按照上面 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;
}
檢查設置minimumZoomScale
和maximumZoomScale
; 根據文檔:
maximumZoomScale
必須大於minimumZoomScale
才能啟用縮放。
因此,將值設置為相同應該禁用縮放。
我曾嘗試將UIScrollView
minimumZoomScale
和maximumZoomScale
屬性設置為1
或將UIView
isMultipleTouchEnabled
屬性設置為false
或從UIScrollViewDelegate
viewForZooming(in:)
返回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
}
}
在這里,我停止縮放滾動視圖的解決方案。
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.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
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.