pinch와 Double tap으로 zoom의 UIImageView 만들기

들여쓰기/아웃라인에서 초점 출력/입력을 한 다음에 더블 헤드로 몇 레벨까지 확대해서 원래의 줄임자UIImageView로 복원하기 때문에 간단하게 필기를 했습니다.

들여쓰기 시 배율 조정된 UIImageView

UIScrollView를 사용하면 UIImageView 곤경에서 초점을 맞추는 코드 검색이 많이 나오지만 프로그램을 먼저 기록한다.

UIScrollView에 UIImageView 배치


우선 초점을 맞추려는 UIImageViewUIScrollView에 설정해야 한다.
이는 Storyboard에서 선택한 경우UIImageView 이후Editor 메뉴Embed in에서 선택한 경우Scroll View.

코드의 경우UIScrollViewaddSubview(_ view:)에서 진행됩니다.
scrollView.addSubview(imageView)

UIScrollView delegate 구성

StoryboardUIViewController의 코드를 연결해서 쓸 수 있다
zoomByPinchDoubleTap.swift
scrollView.delegate = self

UIScrollView의 maximuZoomSccalle 구성


기본값maximumZoomScale은 1이므로 초점이 변하지 않습니다.
이번에는 4배로 초점이 맞춰졌다.
zoomByPinchDoubleTap.swift
self.scrollView.maximumZoomScale = 4.0

UIViewController는 UIScrollViewDelegate 프로토콜을 지원합니다.

UIScrollViewDelegate 필요한 함수는 없지만 초점이 필요해viewForZooming(in:).반환 값은 UIScrollView에 포함됩니다UIImageView.
zoomByPinchDoubleTap.swift
    func viewForZooming(in scrollView: UIScrollView) -> UIView? {
        return imageView
    }
위에서 말한 바와 같이 수축 상태에서 초점UIImageVIew을 바꿀 수 있다.
이번에는 더블 헤드로 2배, 4배의 초점을 맞춰야 하기 때문에 후술UITapGestureRecognizer을 사용했다.

이중 탭을 사용하여 배율 조정


이 동작을 실행하기 위해서 UITapGestureRecognizer 를 사용하여 이벤트를 가져오고 그림 크기를 수동으로 변경합니다.
단계는 다음과 같습니다.

UIScrollView에서 UITOPGesture Recognizer 설정

UIScrollView를 설정하여 UITapGestureRecognizer가 더블 헤드에 반응하도록 한다.UITapGestureRecognizernumberOfTapRequired를 2로 설정하여 더블 헤드에 반응한다.
zoomByPinchDoubleTap.swift
        let recognizer = UITapGestureRecognizer(target: self,
                                                action: #selector(onDoubleTap(_:)))
        recognizer.numberOfTapsRequired = 2
        scrollView.addGestureRecognizer(recognizer)

두 번 클릭할 때 동작에 그림 크기 조정 코드를 쓰십시오


구체적으로 UIScrollView의 크기와 scale에 따라 그림의 표시 범위를 계산하여 UIScrollView를 이 범위까지 초점화한다.
최대 4배까지 초점이 맞춰졌다면 1배로 회복된다.
zoomByPinchDoubleTap.swift
    @objc func onDoubleTap(_ sender: UITapGestureRecognizer) {
        let scale = min(scrollView.zoomScale * 2, scrollView.maximumZoomScale)
        
        if scale != scrollView.zoomScale {
            let tapPoint = sender.location(in: imageView)
            let size = CGSize(width: scrollView.frame.size.width / scale,
                              height: scrollView.frame.size.height / scale)
            let origin = CGPoint(x: tapPoint.x - size.width / 2,
                                 y: tapPoint.y - size.height / 2)
            scrollView.zoom(to: CGRect(origin: origin, size: size), animated: true)
        }
        else {
            scrollView.zoom(to: scrollView.frame, animated: true)
        }
    }

코드


클립과 더블 헤드 줌UIImageView을 사용한 ViewController 코드가 GiitHub에 놓여 있다.
https://gist.github.com/paraches/ca58b5acb0585d5080feaaa5fa869998

좋은 웹페이지 즐겨찾기