UIImageView收缩缩放swift

UIImageView收缩缩放swift,swift,uiimageview,uipinchgesturerecognizer,Swift,Uiimageview,Uipinchgesturerecognizer,我希望有人能帮我。我正在尝试允许用户在UIImageView上收缩缩放(允许最大和最小级别)。但由于某些原因,它不能正常工作。图像放大一点,然后反弹回来。多谢各位 这是缩放功能 func zoom(sender:UIPinchGestureRecognizer) { if sender.state == .Ended || sender.state == .Changed { let currentScale = self.view.frame.size.width

我希望有人能帮我。我正在尝试允许用户在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

    }

}
func缩放(发送方:UIPinchGestureRecognitor){
如果sender.state==.end | | sender.state==.Changed{
让currentScale=self.view.frame.size.width/self.view.bounds.size.width
var newScale=currentScale*sender.scale
如果newScale<1{
newScale=1
}
如果新闻级别>9{
新闻等级=9
}
let transform=CGAffineTransformMakeScale(newScale,newScale)
self.imageView?.transform=transform
sender.scale=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
}

在我看来,问题在于你对当前规模的确定。它始终等于1,因为您更改了imageView的比例。您应按如下方式分配currentScale:

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

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

UIImageView使用UIScrollView收缩缩放| |图像缩放ios,使用swift 3和Xcode 8字母

func viewForZooming(in scrollView: UIScrollView) -> UIView? {
    return self.mainImage
}
在情节提要中设置uiscrollview委托


我认为最大的问题是在
func
的末尾,您有
sender.scale=1
。如果你删除了那行代码,你的图像不应该每次都反弹回来。

Swift 3解决方案

默认情况下,
UIImageView的
userinteraction
被禁用。在
UIImageView
中添加任何手势之前,请先启用它

imgView.isUserInteractionEnabled=true

相对于屏幕中两个触摸点的比例因子 坐标

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
}
我在Swift 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
  }
}

这是一个老问题,但我看不到任何解释原始代码错误的答案

这一行:

let currentScale = self.view.frame.size.width / self.view.bounds.size.width
正在处理主视图而不是图像视图,因此比例计算始终为~1

这个简单的更改使其行为符合预期

let currentScale = sender.view!.frame.size.width / sender.view!.bounds.size.width

通过将self更改为sender(并强制view展开),缩放计算按预期工作。

我在这里结束,可能是搜索错误的方式

我在contentMode=.center中使用imageView之后。 但我判断它太放大了,我在寻找缩小它的方法。 以下是方法:

    self.imageView.contentScaleFactor = 3

1就好像你在做什么。更多1缩小。。。3适用于我,但您需要对其进行测试。

使用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设置缩放限制。

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

扩展UIImageView{ func enableZoom(){ 让pinchGesture=UIPinchGestureRecognizer(目标:自我,操作:#选择器(startZooming(:)) isUserInteractionEnabled=true AddGestureRecognitor(pinchGesture) } @objc 私有函数启动库(uu发送方:UIPinchGestureRecognizer){ 设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=缩放 sender.scale=1 } }
您可以使用
图像滚动视图
开源、可缩放和可滚动的图像视图。^^这对我来说非常有效,花了大约30秒。谢谢你,马克!这真的就像这篇文章说的一样简单!这应该是Swift 3的公认答案。我尝试过的其他方法都不管用,包括上面接受的答案。没有必要在代码中设置scroll views委托,因为它已经通过故事板进行了设置,如上图所示。我对swift和xcode非常陌生,我尝试在包含图像的tableview中执行相同的操作,每个tablecell都有自己的后端。因此,我试图将委托作为每个tablecell的后端,但它不起作用。按照上面的步骤做了吗,我有什么遗漏吗?回答得很好!我喜欢它的简单性(没有不必要的子类等),而且它在没有故事板的情况下运行良好(只需设置委托并使用添加UIImageView作为UIScrollView的子视图。请尝试清楚地解释…什么是lastScale whats new scale在此,您在哪里声明了它们,它们的子项是什么请在此处添加更多详细信息。代码不完整。什么是lastScale whats new scale在此?结束时如何恢复到原始大小hing@rajeshkumar rwing当pinching结束时,调用
scrollView.zoomScale=1.0
工作解决方案,谢谢这个解决方案。可以向左向右滚动吗?@John LimaI认为这是最好的答案。它可以缩放,也可以滚动。此外,它还支持双标签操作。我想再说一件事。它真的很容易使用NTION开发者!!!这是一个完美的答案。这甚至适用于Swift 5,具有非常小的自动更正。请下去查看“akhilendra singh”的答案。这个答案并不完美。
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
 }
}