UIImageView捏缩放swift

Ran*_*tes 52 uiimageview uipinchgesturerecognizer 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

    }

}
Run Code Online (Sandbox Code Playgroud)

Par*_*la 113

使用UIScrollView ||进行UIImageView捏缩放 图像缩放在swift 3和Xcode 8字母 Youtube视频URL中的ios

设置uiscrollview在故事板中委派 在此输入图像描述

 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
    }
Run Code Online (Sandbox Code Playgroud)

  • 卓越!它真的很容易就像这篇文章所说的那样! (3认同)

Ran*_*tes 47

我决定将imageView添加到UIScrollView.它允许用户缩放和平移.这是我使用的代码.

为了设置我使用的最大/最小缩放:

    scrollImg.minimumZoomScale = 1.0
    scrollImg.maximumZoomScale = 10.0
Run Code Online (Sandbox Code Playgroud)

这是代码的其余部分.

    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!)
Run Code Online (Sandbox Code Playgroud)

我也必须添加它

func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
    return self.imageView
}
Run Code Online (Sandbox Code Playgroud)

Swift 3及以上功能原型

func viewForZooming(in scrollView: UIScrollView) -> UIView? {
    return self.mainImage
}
Run Code Online (Sandbox Code Playgroud)


Joh*_*ima 34

支持Swift 5.1,您可以创建 的扩展UIImageView,如下所示:

extension UIImageView {
  func enableZoom() {
    let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(startZooming(_:)))
    isUserInteractionEnabled = true
    addGestureRecognizer(pinchGesture)
  }

  @objc
  private func startZooming(_ sender: UIPinchGestureRecognizer) {
    let scaleResult = sender.view?.transform.scaledBy(x: sender.scale, y: sender.scale)
    guard let scale = scaleResult, scale.a > 1, scale.d > 1 else { return }
    sender.view?.transform = scale
    sender.scale = 1
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 喜欢这个解决方案。可以左右滚动吗?@约翰·利马 (8认同)
  • 我发现无论您在哪里捏合缩放,它总是会放大同一区域。有没有一种方法可以让您无论在哪里捏缩放都可以进行缩放? (3认同)
  • 使用滚动视图可以更好地实现滚动效果 (2认同)

小智 14

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
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 缩小结束后,调用`scrollView.zoomScale = 1.0`。 (2认同)

小智 9

使用 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
 }
}
Run Code Online (Sandbox Code Playgroud)

您可以使用 scale.a、scale.b、scale.c、scale.d、scale.tx 和 scale.ty 来设置比例限制。


huy*_*ync 7

您可以使用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()
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我还想多说一件事。它真的很容易使用。 (2认同)

小智 6

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

let currentScale = self.imageView?.frame.size.width / self.imageView?.bounds.size.width  
Run Code Online (Sandbox Code Playgroud)


Raj*_*r R 5

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
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 试着清楚地解释一下......什么是lastScale这里有什么新规模,你在哪里宣布它们,它们的子类是什么 (2认同)

Tha*_*nga 5

斯威夫特 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
}
Run Code Online (Sandbox Code Playgroud)