machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Учебное пособие по iOS Swift: масштабирование ImageView и горизонтальное разбиение на страницы

Дата публикации Oct 3, 2019

Щепотка, чтобы увеличить изображение

Когда мы создаем приложение, которое имеет функцию просмотра фотографий для любых страниц просмотра сведений, программа просмотра фотографий обычно должна иметь масштабируемые и прокручиваемые функции, которые позволяют вашему пользователю просматривать фотографии более подробно. Этот элемент управления поможет вам отображать изображения с возможностью масштабирования и прокрутки. Мы собираемся добиться этой функции помощи UIScrollView.

И нажмитеВотзагрузите полный проект и затем откройте его в Xcode.

Мы можем создать демонстрационное приложение, после создания примера приложения в ViewController мы можем добавить одно подпредставление UIScrollView для подкачки в нашем текущем представлении.

let viewHeight: CGFloat = self.view.bounds.size.height
let viewWidth: CGFloat = self.view.bounds.size.widthlet scrollView = UIScrollView(frame: CGRect(x: 0, y: 0, width: viewWidth, height: viewHeight))
self.view.addSubview(scrollView)

И этот вид прокрутки мы будем использовать как горизонтальный просмотр страницы. поэтому нужно добавить опцию страницы для scrollView.

scrollView.isPagingEnabled = true

После добавления этого мы можем начать добавлять горизонтальную страницу ImageView для просмотра и увеличения изображения. Перед началом кода нам нужно изображения, поэтому я создаю одну папку с изображениями и добавляю изображения в эту папку. После добавления изображений мы можем создать массив изображений.

let animals = [“tiger”,”horse”,”lion”,”rabbit”,”elephant”]

Теперь у нас есть список массивов изображений. поэтому мы можем добавлять изображения в scrollView.

var xPostion: CGFloat = 0for animal in animals {    let view = UIView(frame: CGRect(x: xPostion, y: 0, 
width: viewWidth, height: viewHeight)) let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: view.frame.size.height)) imageView.image = UIImage(named:animal)) view.addSubview(imageView) scrollView.addSubview(view)
}scrollView.contentSize = CGSize(width: xPostion, height: viewHeight)

Теперь у нас есть горизонтальная страница с изображениями. но у нас нет опции увеличения и уменьшения. так что мы можем двигаться к этому.

Создайте новый открытый класс для масштабирования и прокрутки изображения. Я создал файл ImageViewZoom.swift, и этот класс расширился от UIScrollView, а также создал протокол делегата для callBacks.

open class ImageViewZoom: UIScrollView {
}@objc public protocol ImageViewZoomDelegate: UIScrollViewDelegate {
}

Тогда мы можем инициализировать scrollView

required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
initialize()
}private func initialize() {
showsVerticalScrollIndicator = false
showsHorizontalScrollIndicator = false
bouncesZoom = true
decelerationRate = UIScrollView.DecelerationRate.fast
delegate = self
}

После завершения инициализации мы можем добавить подпункт UIImageView для scrollView и добавитьUITapGestureRecognizerдля изображения двойное нажатие ручки действия.

@objc public private(set) var zoomView: UIImageView? = nil@objc open func display(image: UIImage) {
if let zoomView = zoomView {
zoomView.removeFromSuperview()
}
zoomView = UIImageView(image: image)
zoomView!.isUserInteractionEnabled = true
addSubview(zoomView!)
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(ImageViewZoom.doubleTapGestureRecognizer(_:)))
tapGesture.numberOfTapsRequired = 2 zoomView!.addGestureRecognizer(tapGesture)
}

Этот imageView также нуждается в contentMode, поэтому мы можем создать перечисление для ScaleMode, как показано ниже

@objc public enum ScaleMode: Int {
case aspectFill
case aspectFit
case widthFill
case heightFill
}

если мы нажмем на imageView, дважды нужно изменить размер изображения, а после изменения размера изображения снова, если мы нажмем два раза, нужно вернуть тот же размер.

@objc func doubleTapGestureRecognizer(_ gestureRecognizer: UIGestureRecognizer) {// zoom out if it bigger than middle scale point. Else, zoom inif zoomScale >= maximumZoomScale / 2.0 {
setZoomScale(minimumZoomScale, animated: true)
} else {
let center = gestureRecognizer.location(in: gestureRecognizer.view)
let zoomRect = zoomRectForScale(ImageViewZoom.kZoomInFactorFromMinWhenDoubleTap * minimumZoomScale, center: center)
zoom(to: zoomRect, animated: true) }
}private func zoomRectForScale(_ scale: CGFloat, center: CGPoint) -> CGRect { var zoomRect = CGRect.zero
zoomRect.size.height = frame.size.height / scale
zoomRect.size.width = frame.size.width / scale// choose an origin so as to get the right center. zoomRect.origin.x = center.x — (zoomRect.size.width / 2.0)
zoomRect.origin.y = center.y — (zoomRect.size.height / 2.0)
return zoomRect
}

и нужно обрабатывать делегат scrollView и TapGestures также. после того, как все это сделано, мы можем использовать этот класс вместо UIImageView во ViewContoller.

for animal in animals {let view = UIView(frame: CGRect(x: xPostion, y: 0, width: viewWidth, height: viewHeight))xPostion += viewWidthlet imageView = ImageViewZoom(frame: CGRect(x: 0, y: 0, width: view.frame.size.width, height: view.frame.size.height))imageView.setup()imageView.imageScrollViewDelegate = selfimageView.imageContentMode = .aspectFitimageView.initialOffset = .centerimageView.display(image: UIImage(named: animal)!)view.addSubview(imageView)scrollView.addSubview(view)}

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

Оригинальная статья

Footer decor

© machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map