Выключить Масштабирование в UIScrollView
Кто-нибудь знает, как временно отключить масштабирование при использовании UIScrollView?
Я вижу, что вы можете отключить прокрутку, используя следующее:
self.scrollView.scrollEnabled = false;
но я не вижу подобную команду для масштабирования. Любые мысли?
Ответы
Ответ 1
Если вы хотите отключить возможность пользователя масштабировать жесты, то в iOS 5 и выше вы можете отключить жест повышения. Это по-прежнему позволяет вам контролировать вид прокрутки из кода...
scrollView.pinchGestureRecognizer.enabled = NO;
аналогично для кастрюли...
scrollView.panGestureRecognizer.enabled = NO;
Это должно вызываться в - (void)viewDidAppear:(BOOL)animated
или более поздний, так как в противном случае система сбрасывает его во включенное состояние.
Swift 4.x и выше:
imageZoomView.pinchGestureRecognizer?.isEnabled
= false/true
Ответ 2
Следуя совету fbrereto выше, я создал две функции lockZoom и unlockZoom. При блокировке Zoom я скопировал масштаб max и min zoom в переменные, затем установите масштаб масштабирования max и min в 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;
}
Ответ 3
Также вы можете вернуть "nil" в виде масштабирования в UIScrollViewDelegate:
- (UIView *) viewForZoomingInScrollView:(UIScrollView *) scrollView
{
return canZoom?view:nil;
}
Ответ 4
Проверить настройку minimumZoomScale
и maximumZoomScale
; Согласно документы:
maximumZoomScale
должно быть больше, чем minimumZoomScale
для масштабирования для включения.
Таким образом, установка значений одинакова должна отключать масштабирование.
Ответ 5
Я знаю, что это действительно старый вопрос, но я сделал небольшое изменение для своих целей.
Я хотел бы иметь возможность легко определить, действительно ли масштабирование было включено/отключено, не полагаясь на сравнение между 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;
Ответ 6
здесь, мое решение для остановки масштабирования на scrollview.
self.scrollView.minimumZoomScale=self.scrollView.maximumZoomScale;
Ответ 7
версия Swift 3:
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)
}
}
Ответ 8
Я попытался установить свойства minimumZoomScale
и maximumZoomScale
свойств UIScrollView
в 1
или isMultipleTouchEnabled
с UIView
до false
или вернуть nil
из viewForZooming(in:)
из UIScrollViewDelegate
, но никто не работал. В моем случае после нескольких проб и ошибок в моем случае работает следующее [Протестировано на 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
}
}
Ответ 9
Если вы хотите отключить только масштабирование с жестким типом, ниже код делает трюк.
scrollView.pinchGestureRecognizer?.requireGestureRecognizerToFail(scrollView.panGestureRecognizer)