UIImageView щепотка zoom swift
Я надеялся, что кто-то сможет мне помочь. Я пытаюсь разрешить пользователю увеличивать масштаб изображения на UIImageView (с допустимым максимальным и минимальным уровнем). Но почему-то это не работает. Изображение немного масштабируется, а затем просто отскакивает назад. Спасибо.
здесь функция масштабирования
func zoom(sender:UIPinchGestureRecognizer) {
if sender.state == .Ended || sender.state == .Changed {
let currentScale = self.view.frame.size.width / self.view.bounds.size.width
var newScale = currentScale*sender.scale
if newScale < 1 {
newScale = 1
}
if newScale > 9 {
newScale = 9
}
let transform = CGAffineTransformMakeScale(newScale, newScale)
self.imageView?.transform = transform
sender.scale = 1
}
}
Ответы
Ответ 1
Я решил добавить imageView к UIScrollView. Это позволяет пользователю масштабировать и перемещаться. Вот код, который я использовал.
чтобы установить максимальное/минимальное увеличение, я использовал:
scrollImg.minimumZoomScale = 1.0
scrollImg.maximumZoomScale = 10.0
вот остальная часть кода.
var vWidth = self.view.frame.width
var vHeight = self.view.frame.height
var scrollImg: UIScrollView = UIScrollView()
scrollImg.delegate = self
scrollImg.frame = CGRectMake(0, 0, vWidth!, vHeight!)
scrollImg.backgroundColor = UIColor(red: 90, green: 90, blue: 90, alpha: 0.90)
scrollImg.alwaysBounceVertical = false
scrollImg.alwaysBounceHorizontal = false
scrollImg.showsVerticalScrollIndicator = true
scrollImg.flashScrollIndicators()
scrollImg.minimumZoomScale = 1.0
scrollImg.maximumZoomScale = 10.0
defaultView!.addSubview(scrollImg)
imageView!.layer.cornerRadius = 11.0
imageView!.clipsToBounds = false
scrollImg.addSubview(imageView!)
Я также должен был добавить это также
func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
return self.imageView
}
Swift 3 и выше прототип функции
func viewForZooming(in scrollView: UIScrollView) -> UIView? {
return self.mainImage
}
Ответ 2
UIImageView масштабирование с помощью UIScrollView || масштабирование изображения ios в swift 3 и Xcode 8 буквенное видео YouTube URL
установить uiscrollview Делегат в раскадровке ![enter image description here]()
class PhotoDetailViewController: UIViewController, UIScrollViewDelegate {
@IBOutlet weak var scrollView: UIScrollView!
@IBOutlet weak var imgPhoto: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
scrollView.minimumZoomScale = 1.0
scrollView.maximumZoomScale = 6.0
// scrollView.delegate = self - it is set on the storyboard.
}
func viewForZooming(in scrollView: UIScrollView) -> UIView? {
return imgPhoto
}
Ответ 3
Вариант для Swift 4
class ViewController: UIViewController, UIScrollViewDelegate {
@IBOutlet weak var scrolView: UIScrollView!
@IBOutlet weak var imgPhoto: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
scrolView.delegate = self
scrolView.minimumZoomScale = 1.0
scrolView.maximumZoomScale = 10.0
}
func viewForZooming(in scrollView: UIScrollView) -> UIView? {
return imgPhoto
}
}
Ответ 4
На мой взгляд, проблема заключается в том, что вы определяете currentScale. Он всегда равен 1, потому что вы меняете масштаб своего изображения. Вы должны назначить текущий currentcale следующим образом:
let currentScale = self.imageView?.frame.size.width / self.imageView?.bounds.size.width
Ответ 5
Вы можете использовать ImageScrollView с открытым исходным кодом, масштабируемое и прокручиваемое изображение. http://github.com/huynguyencong/ImageScrollView
Как это с открытым исходным кодом, добавить ImageView в ScrollView
open class ImageScrollView: UIScrollView {
var zoomView: UIImageView? = nil
}
extension ImageScrollView: UIScrollViewDelegate{
public func viewForZooming(in scrollView: UIScrollView) -> UIView? {
return zoomView
}
public func scrollViewDidZoom(_ scrollView: UIScrollView) {
adjustFrameToCenter()
}
}
Ответ 6
Swift 3 решение
По умолчанию пользовательское UIImageView's
userInteration
отключено. Включите его перед добавлением любых жестов в UIImageView
.
imgView.isUserInteractionEnabled = true
Масштабный коэффициент относительно точек двух касаний в экранных координатах
var lastScale:CGFloat!
func zoom(gesture:UIPinchGestureRecognizer) {
if(gesture.state == .began) {
// Reset the last scale, necessary if there are multiple objects with different scales
lastScale = gesture.scale
}
if (gesture.state == .began || gesture.state == .changed) {
let currentScale = gesture.view!.layer.value(forKeyPath:"transform.scale")! as! CGFloat
// Constants to adjust the max/min values of zoom
let kMaxScale:CGFloat = 2.0
let kMinScale:CGFloat = 1.0
var newScale = 1 - (lastScale - gesture.scale)
newScale = min(newScale, kMaxScale / currentScale)
newScale = max(newScale, kMinScale / currentScale)
let transform = (gesture.view?.transform)!.scaledBy(x: newScale, y: newScale);
gesture.view?.transform = transform
lastScale = gesture.scale // Store the previous scale factor for the next pinch gesture call
}
}
Ответ 7
Решение Swift 3
Это код, который я использовал. Я добавил imageView в scrollView как подвью.
class ZoomViewController: UIViewController,UIScrollViewDelegate {
@IBOutlet weak var scrollView:UIScrollView!
@IBOutlet weak var imageView:UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
scrollView.delegate = self
scrollView.minimumZoomScale = 1.0
scrollView.maximumZoomScale = 10.0//maximum zoom scale you want
scrollView.zoomScale = 1.0
}
func viewForZooming(in scrollView: UIScrollView) -> UIView? {
return imageView
}
Ответ 8
Используя Swift 5.0, вот как это работает для меня:
let myImageView = UIImageView(image: myImage)
myImageView.isUserInteractionEnabled = true
let pinchMethod = UIPinchGestureRecognizer(target: self, action: #selector(pinchImage(sender:)))
myImageView.addGestureRecognizer(pinchMethod)
@objc func pinchImage(sender: UIPinchGestureRecognizer) {
guard let sender.view != nil else { return }
if let scale = (sender.view?.transform.scaledBy(x: sender.scale, y: sender.scale)) {
guard scale.a > 1.0 else { return }
guard scale.d > 1.0 else { return }
sender.view?.transform = scale
sender.scale = 1.0
}
}
Вы можете использовать scale.a, scale.b, scale.c, scale.d, scale.tx и scale.ty, чтобы установить пределы масштаба.
Ответ 9
Я думаю, что самая большая проблема в конце вашего func
, у вас есть sender.scale = 1
. Если вы удалите эту строку кода, ваше изображение не должно просто отскакивать каждый раз.
Ответ 10
Я разместил ответ здесь для масштабирования с помощью как пинча, так и двойного нажатия в Swift 3. Работает отлично.
Ответ 11
Это старый вопрос, но я не вижу ответов, объясняющих, что не так с исходным кодом.
Эта строка:
let currentScale = self.view.frame.size.width / self.view.bounds.size.width
Работает на основном виде, а не на imageView, поэтому вычисление масштаба всегда составляет ~ 1
Это простое изменение заставляет его вести себя как ожидалось
let currentScale = sender.view!.frame.size.width / sender.view!.bounds.size.width
изменяя себя на отправителя (и заставляя представление развернуть), вычисление масштаба работает как ожидалось.
Ответ 12
Я оказался здесь, вероятно, в поисках неправильного пути.
Я был после того, как мой imageView в contentMode =.centre. Но я оценил его слишком увеличенным и искал способ уменьшить его. Вот как:
self.imageView.contentScaleFactor = 3
1, как будто вы делаете что-нибудь. Больше чем 1 уменьшает... 3 работает для меня, но вы должны проверить это.
Ответ 13
Я использую приведенный ниже код для увеличения изображения, но мой imageView увеличивается в 4 раза, а затем я пытаюсь перетащить imageView в 4-масштабном масштабе.
Как остановить масштабирование выше 4 scaleFactor или Как остановить масштабирование при перетаскивании?
class ZoomViewController: UIViewController,UIScrollViewDelegate {
@IBOutlet weak var scrollView:UIScrollView!
@IBOutlet weak var imageView:UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
scrollView.delegate = self
scrollView.minimumZoomScale = 1.0
scrollView.maximumZoomScale = 4.0
}
func viewForZooming(in scrollView: UIScrollView) -> UIView? {
return imageView
}