Как включить масштабирование в UIScrollView
Как включить эффект масштабирования в UIScrollView?
- Интерфейс UIScrollViewBegan
- Показать / скрыть UIToolbar, «перемещать пальцы», точно так же, как, например, в iOS7 Safari
- UIScrollView не прокрутка
- Пейджинг UIScrollView с шагом меньше размера кадра
- Как я могу имитировать нижний лист из приложения «Карты»?
- Прокрутка UITableView внутри UIScrollView
- Прокрутка Не работает IOS 7
- UIScrollView не прокручивается после обновления до iOS7 / xcode 5
Посмотрите это видео
Описание из видео:
- Добавить делегат
UIScrollViewDelegate
- Возьмите
UIScrollView
- Возьмите UIImageView, который будет добавлен в Scrollview
- Поместите вид прокрутки в главное окно
- Подключить делегатов
- Настройка образа
- Установите масштаб масштабирования макс / мин [основная вещь здесь]
- Внедрить метод делегата для возврата
Ответ здесь :
В представлении прокрутки также выполняется масштабирование и панорамирование содержимого. По мере того, как пользователь делает жест щелкания или вырезания, вид прокрутки регулирует смещение и масштаб содержимого. Когда этот жест заканчивается, объект, управляющий представлением контента, должен обновлять подсмотры содержимого по мере необходимости. (Обратите внимание, что жест может закончиться, и палец все равно может быть опущен.) Пока этот жест продолжается, представление прокрутки не отправляет никаких вызовов отслеживания в подвью.
Класс UIScrollView может иметь делегат, который должен принять протокол UIScrollViewDelegate. Для масштабирования и панорамирования для работы делегат должен реализовать как viewForZoomingInScrollView: так и scrollViewDidEndZooming: withView: atScale :; кроме того, максимальная (максимальная шкала ZoomScale) и минимальная шкала (minimumZoomScale) должны быть разными.
Так:
- Вам нужен делегат, который реализует
UIScrollViewDelegate
и настроен наdelegate
в вашем экземпляреUIScrollView
- На вашем
viewForZoomingInScrollView:
вы должны реализовать один метод:viewForZoomingInScrollView:
( который должен вернуть представление содержимого, которое вам интересно в масштабировании ). Вы также можете реализоватьscrollViewDidEndZooming:withView:atScale:
необязательно. - В вашем экземпляре
UIScrollView
вы должны установитьminimumZoomScale
иmaximumZoomScale
для разных (по умолчанию они равны 1.0).
Примечание . Интересная вещь в этом заключается в том, что если вы хотите разорвать масштабирование. Достаточно ли вернуть nil
в viewForZooming...
метод? Это разрывает масштаб, но некоторые из жестов будут испорчены (для двух пальцев). Поэтому, чтобы разбить масштабирование, вы должны установить минимальную и максимальную масштабную шкалу в 1.0.
Прочитайте этот учебник Рэй Вендерлих:
http://www.raywenderlich.com/76436/use-uiscrollview-scroll-zoom-content-swift
Если вы пройдете через раздел «Прокрутка и масштабирование изображения большего размера», он получит изображение вверх и позволит вам зажать и увеличить масштаб.
В случае, если ссылка будет изменена, вот основная информация: Поместите этот код в свой controller просмотра (это устанавливает основную функциональность):
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() }
Добавьте это в class:
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) }
Если вы хотите более подробно прочитать учебник, но это в значительной степени охватывает его.
Убедитесь, что вы установили свой viewController в качестве делегата scrollViews и реализуете:
func viewForZooming(in scrollView: UIScrollView) -> UIView? { return imageView }
Проверьте tucan9389 / ZoomableScrollView forked из huynguyencong / ImageScrollView.
Просто создайте ZoomableScrollView
и вызовите display(view:)
.
DEMO
DEMO
Применение
import ZoomableScrollView class ViewController: UIViewController @IBOutlet weak var zoomableScrollView: ZoomableScrollView! override func viewDidLoad() { super.viewDidLoad() let myView = MyCustomView() zoomableScrollView.display(view: myView) } }
Я не думаю, что это работает для iOS 5.0 и Xcode 4.3+ Im, ища то же самое здесь, я нашел это для изображений, но это может вам помочь.