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
'sourcetip' 카테고리의 다른 글
MYSQL 유니언 구별 (0) | 2023.10.05 |
---|---|
JDBC를 사용하여 SQL Server 2008 데이터베이스에 연결하려면 어떻게 해야 합니까? (0) | 2023.10.05 |
디브를 어떻게 반응형 사각형으로 스타일링 할 수 있을까요? (0) | 2023.10.05 |
맥 OS X의 표준 C 라이브러리는 어디에 있습니까? (0) | 2023.10.05 |
dpkg: 패키지 mysql-server(의존성 문제)를 처리하는 동안 오류가 발생했습니까? (0) | 2023.10.05 |