2015-05-03 4 views
23

Я надеялся, что кто-то может мне помочь. Я пытаюсь разрешить пользователю увеличивать масштаб изображения на UIImageView (с допустимым максимальным и минимальным уровнем). Но почему-то это не работает. Изображение немного масштабируется, а затем просто отскакивает назад. Спасибо.UIImageView pinch zoom swift

здесь является увеличение функ

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 

    } 

} 
+6

Вы можете использовать открытое исходное изображение 'ImageScrollView', масштабируемое и прокручиваемое изображение. https://github.com/huynguyencong/ImageScrollView – huync

+2

^^^ Это отлично поработало для меня, заняло около 30 секунд. Спасибо –

ответ

33

Я решил добавить 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 
} 
5

На мой взгляд, проблема заключается ваше определение currentScale. Он всегда равен 1, потому что вы меняете масштаб своего изображения. Вы должны назначить свой currentScale следующим образом:

let currentScale = self.imageView?.frame.size.width/self.imageView?.bounds.size.width 
4

Вы можете использовать ImageScrollView с открытым исходным кодом, масштабируемой и прокручивать вид изображения. http://github.com/huynguyencong/ImageScrollView

Как это OpenSource, добавьте 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() 
    } 
} 
50

UIImageView щепотка зум с UIScrollView || образ масштабирования ИОС в быстром 3 и Xcode 8 письма

набор 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

Замечательно! Это действительно так просто, как говорится в этом посте! – instanceof

+1

Это должен быть принятый ответ для Swift 3.Ничего другого, с которым я пытался работать, включая принятый ответ выше. – hawmack13

+1

Нет необходимости устанавливать делегат прокрутки в коде, поскольку он уже был установлен через раскадровку, как показано на изображении выше. – C6Silver

0

Я думаю, что самая большая проблема в конце вашего func, у вас есть sender.scale = 1. Если вы удалите эту строку кода, ваше изображение не должно просто возвращаться каждый раз.

1

Swift 3 раствора

По userInterations по умолчанию UIImageView является отключен. Включите его перед добавлением каких-либо жестов в UIImageView. (imgView.isUserInteractionEnabled = true)

func zoom(sender: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 
    } 
} 
+1

попытайтесь объяснить ясно ... whats is lastScale whats new scale здесь, где вы их объявили, каков их подкласс – srivas

1

Свифта 3 Раствор

Это код, который я использовал. Я добавил изображениеView в 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 
} 
0

Я отправил ответ here для увеличения функциональности как с щепоткой и двойным краном в Swift 3. Работает отлично.