Как включить масштабирование в UIScrollView - PullRequest
52 голосов
/ 07 сентября 2010

Как включить эффект масштабирования в UIScrollView?

Ответы [ 4 ]

190 голосов
/ 26 мая 2011

Ответ здесь :

Представление прокрутки также обрабатывает масштабирование и панорамирование содержимого.Когда пользователь делает жест ввода или вывода, представление прокрутки регулирует смещение и масштаб содержимого.Когда жест заканчивается, объект, управляющий представлением контента, должен обновлять подпредставления контента по мере необходимости.(Обратите внимание, что жест может закончиться, а палец все еще может быть опущен.) Пока жест выполняется, представление прокрутки не отправляет никаких вызовов отслеживания в подпредставление.

Класс UIScrollView может иметь делегата, которыйдолжен принять протокол UIScrollViewDelegate.Чтобы масштабирование и панорамирование работали, делегат должен реализовать и viewForZoomingInScrollView: и scrollViewDidEndZooming: withView: atScale :;кроме того, максимальный (максимумZoomScale) и минимальный (минимумZoomScale) масштаб масштабирования должны быть разными.

Итак:

  1. Вам нужен делегат, который реализует UIScrollViewDelegate и имеетустановите delegate в вашем UIScrollView экземпляре
  2. В вашем делегате вы должны реализовать один метод: viewForZoomingInScrollView: (, который должен возвращать представление содержимого, которое вас интересует, для увеличения ),Вы также можете реализовать scrollViewDidEndZooming:withView:atScale: опционально.
  3. В вашем экземпляре UIScrollView вы должны установить minimumZoomScale и maximumZoomScale, которые будут разными (по умолчанию они равны 1.0).

Примечание: Интересно, что если вы хотите сломать масштабирование.Достаточно ли вернуть nil в методе viewForZooming...?Это нарушает масштабирование, но некоторые жесты будут испорчены (для двух пальцев).Поэтому, чтобы прервать масштабирование, вы должны установить минимальное и максимальное масштабирование на 1,0.

8 голосов
/ 02 ноября 2015

Прочтите этот урок Рэя Вендерлиха:

http://www.raywenderlich.com/76436/use-uiscrollview-scroll-zoom-content-swift

Если вы будете следовать разделу «Прокрутка и масштабирование увеличенного изображения», оно получит изображение и позволит вамчтобы ущипнуть и увеличить.

В случае, если ссылка будет изменена, вот основная информация: Поместите этот код в ваш контроллер представления (это устанавливает основные функции):

override func viewDidLoad() {
  super.viewDidLoad()

  // 1
  let image = UIImage(named: "photo1.png")!
  imageView = UIImageView(image: image)
  imageView.frame = CGRect(origin: CGPoint(x: 0, y: 0), size:image.size)
  scrollView.addSubview(imageView)

  // 2
  scrollView.contentSize = image.size

  // 3
  var doubleTapRecognizer = UITapGestureRecognizer(target: self, action: "scrollViewDoubleTapped:")
  doubleTapRecognizer.numberOfTapsRequired = 2
  doubleTapRecognizer.numberOfTouchesRequired = 1
  scrollView.addGestureRecognizer(doubleTapRecognizer)

  // 4
  let scrollViewFrame = scrollView.frame
  let scaleWidth = scrollViewFrame.size.width / scrollView.contentSize.width
  let scaleHeight = scrollViewFrame.size.height / scrollView.contentSize.height
  let minScale = min(scaleWidth, scaleHeight);
  scrollView.minimumZoomScale = minScale;

  // 5
  scrollView.maximumZoomScale = 1.0
  scrollView.zoomScale = minScale;

  // 6
  centerScrollViewContents()
}

Добавьте это ккласс:

func centerScrollViewContents() {
  let boundsSize = scrollView.bounds.size
  var contentsFrame = imageView.frame

  if contentsFrame.size.width < boundsSize.width {
    contentsFrame.origin.x = (boundsSize.width - contentsFrame.size.width) / 2.0
  } else {
    contentsFrame.origin.x = 0.0
  }

  if contentsFrame.size.height < boundsSize.height {
    contentsFrame.origin.y = (boundsSize.height - contentsFrame.size.height) / 2.0
  } else {
    contentsFrame.origin.y = 0.0
  }

  imageView.frame = contentsFrame
}

И затем, если вы хотите, чтобы жест двойного касания был распознан:

func scrollViewDoubleTapped(recognizer: UITapGestureRecognizer) {
  // 1        
  let pointInView = recognizer.locationInView(imageView)

  // 2
  var newZoomScale = scrollView.zoomScale * 1.5
  newZoomScale = min(newZoomScale, scrollView.maximumZoomScale)

  // 3
  let scrollViewSize = scrollView.bounds.size
  let w = scrollViewSize.width / newZoomScale
  let h = scrollViewSize.height / newZoomScale
  let x = pointInView.x - (w / 2.0)
  let y = pointInView.y - (h / 2.0)

  let rectToZoomTo = CGRectMake(x, y, w, h);

  // 4
  scrollView.zoomToRect(rectToZoomTo, animated: true)
}

Если вы хотите получить более подробную информацию, прочитайте учебник, но это в значительной степени охватывает его.

0 голосов
/ 03 ноября 2017

Убедитесь, что вы установили свой viewController как делегат scrollViews и внедрили:

func viewForZooming(in scrollView: UIScrollView) -> UIView? {
    return imageView
}
0 голосов
/ 01 сентября 2012

Не думаю, что это работает для iOS 5.0 и Xcode 4.3+. Я ищу то же самое здесь, я нашел это для изображений, но это может помочь вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...