sourcetip

UImageView 핀치 줌 스위프트

fileupload 2023. 10. 5. 23:27
반응형

UImageView 핀치 줌 스위프트

누군가 도와줄 수 있을 거라 기대하고 있었습니다.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

    }

}

UImageView pinch zoom with UIScrollView || 이미지 줌밍 ios in swift 3 and Xcode 8 문자 유튜브 동영상 URL

스토리보드에서 uiscroll view 설정딜러

 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
    }

이미지뷰를 UIScrollView에 추가하기로 했습니다.사용자가 확대/축소할 수 있습니다.여기 제가 사용한 코드가 있습니다.

사용한 max/min zoom을 설정하려면:

    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
}

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

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

ImageScrollView 오픈 소스, 확대/축소 및 스크롤이 가능한 영상 보기를 사용할 수 있습니다.http://github.com/huynguyencong/ImageScrollView

이 오픈 소스처럼 스크롤뷰에 이미지뷰 추가

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()
    }
}

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 = sender.view 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를 사용하여 스케일 한계를 설정할 수 있습니다.

문제는 현재 Scale을 결정하는 것입니다.이미지 보기의 축척을 변경하기 때문에 항상 1과 같습니다.현재 Scale을 다음과 같이 할당해야 합니다.

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

스위프트 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
  }
}

스위프트 3 용액

이것이 제가 사용한 코드입니다.스크롤뷰에 imageView를 서브뷰로 추가하였습니다.

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
}

[2022년 9월 스위프트 5]

제가 보기에 잘 작동하는 방법 중 하나는 스크롤 뷰에 이미지 뷰를 내장하는 것이었는데, 이는 이 답변을 짧게 유지하기 위해 제가 공유하는 라이브러리를 간단히 살펴볼 수 있는 것입니다.저는 이 작은 도서관을 만들어 제작 앱에 사용해 왔습니다.파일을 프로젝트에 설치하거나 복사 붙여넣기만 하면 됩니다.UI View로 작업하고 필요한 경우 딜러에게 더 많은 옵션을 요청할 수 있습니다.

이 라이브러리는 InteractiveImageView라고 불리며 iOS 11.0 이상을 지원하며 GitHub: https://github.com/egzonpllana/InteractiveImageView 에 연결됩니다.

큰의 가 이라고 생각합니다.func,당신은 가지고 있다sender.scale = 1만 해서는 안 됩니다 해당 코드 라인을 제거하면 이미지가 매번 다시 되돌아오는 것만 해서는 안 됩니다.

이것은 오래된 질문이지만 원래 코드에 무엇이 문제인지 설명해주는 답이 없습니다.

다음 줄:

let currentScale = self.view.frame.size.width / self.view.bounds.size.width

imageView 보다는 mainView에서 작업 중이므로 스케일 계산은 항상 ~1

이 단순한 변화는 예상대로 행동하게 만듭니다.

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

self to sender(자체를 발신자로 변경하고 보기를 강제로 포장을 해제)함으로써 스케일 계산이 예상대로 작동합니다.

길을 잘못 찾아왔나 봅니다

contentMode = . centre에서 imageView를 본 후였습니다.하지만 저는 그것이 너무 확대되었다고 판단하고 그것을 축소할 방법을 찾고 있었습니다.방법은 다음과 같습니다.

    self.imageView.contentScaleFactor = 3

1은 마치 당신이 무엇을 하고 있는 것 같습니다.1개 이상 축소하면...저는 3개가 가능하지만 테스트를 해보셔야 합니다.

언급URL : https://stackoverflow.com/questions/30014241/uiimageview-pinch-zoom-swift

반응형