首页 文章

UIImageView捏缩放swift

提问于
浏览
40

我希望有人可以帮助我 . 我试图允许用户在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

    }

}

11 回答

  • 86

    UIImageView pinch zoom with UIScrollView || image zooming ios in swift 3 and Xcode 8 letter Youtube video 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
        }
    
  • 6

    我决定将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 & above function prototype

    func viewForZooming(in scrollView: UIScrollView) -> UIView? {
        return self.mainImage
    }
    
  • 0

    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
      }
    }
    
  • 0

    在我看来,问题是你对currentScale的确定 . 它总是等于1,因为你改变了imageView的比例 . 您应该按如下方式分配currentScale:

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

    您可以使用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()
        }
    }
    
  • 0

    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
      }
    }
    
  • 10

    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
    }
    
  • 0

    我认为最大的问题是在 func 结束时,你有 sender.scale = 1 . 如果删除该行代码,则您的图片不应每次都反弹 .

  • 5

    我在Swift 3中发布了一个用于缩放和双击的缩放功能的答案here . 完美无缺 .

  • 3

    这是一个老问题,但我没有看到任何解释原始代码有什么问题的答案 .

    这一行:

    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
    

    通过将self更改为发送者(以及强制视图解包),缩放计算按预期工作 .

  • 43

    我最终到了这里,可能是以错误的方式搜寻的 .

    我在contentMode = .centre中使用了我的imageView . 但我判断它太大了,我正在寻找一种方法来缩小它 . 这是如何做:

    self.imageView.contentScaleFactor = 3
    

    1就像你在做任何事情一样 . 更多,1缩小... 3适合我,但你需要测试它 .

相关问题