Ios 从用户';s与Swift中的UIScrollView的接触点

Ios 从用户';s与Swift中的UIScrollView的接触点,ios,swift,optimization,uiscrollview,uiimage,Ios,Swift,Optimization,Uiscrollview,Uiimage,下面的Swift代码管理在UIScrollView中放大和缩小UIImage 双击时,图像会放大到中心并缩小到中心 问题: 要将放大点设置为用户在屏幕上触摸的图像区域的中心,需要进行哪些代码更改 (例如,如果用户双击图像的左上角,图像将相应地放大到图像的左上角。) 类ScrollViewController:UIViewController、UIScrollViewDelegate{ var scrollView:UIScrollView! var-imageView:UIImageView!

下面的Swift代码管理在
UIScrollView
中放大和缩小
UIImage

双击时,图像会放大到中心并缩小到中心

问题:

要将放大点设置为用户在屏幕上触摸的图像区域的中心,需要进行哪些代码更改

(例如,如果用户双击图像的左上角,图像将相应地放大到图像的左上角。)

类ScrollViewController:UIViewController、UIScrollViewDelegate{
var scrollView:UIScrollView!
var-imageView:UIImageView!
重写func viewDidLoad(){
super.viewDidLoad()
imageView=UIImageView(图像:UIImage(名为:“image.png”))
scrollView=UIScrollView(框架:view.bounds)
scrollView.backgroundColor=UIColor.blackColor()
scrollView.contentSize=imageView.bounds.size
scrollView.autoresizingMask=[UIViewAutoresizing.FlexibleWidth,UIViewAutoresizing.FlexibleHeight]
scrollView.contentOffset=CGPoint(x:1000,y:450)
scrollView.addSubview(imageView)
view.addSubview(滚动视图)
scrollView.delegate=self
setZoomScale()
SetupGestureRecognitor()
}
func viewForZoomingInScrollView(滚动视图:UIScrollView)->UIView{
返回图像视图
}
重写func viewWillLayoutSubviews(){
setZoomScale()
}
func setZoomScale(){
让imageViewSize=imageView.bounds.size
让scrollViewSize=scrollView.bounds.size
让widthScale=scrollViewSize.width/imageViewSize.width
设heightScale=scrollViewSize.height/imageViewSize.height
scrollView.minimumZoomScale=min(宽度刻度、高度刻度)
scrollView.zoomScale=1.0
}
func scrollViewDidZoom(scrollView:UIScrollView){
让imageViewSize=imageView.frame.size
让scrollViewSize=scrollView.bounds.size
让verticalPadding=imageViewSize.heightscrollView.minimumZoomScale){
scrollView.setZoomScale(scrollView.minimumZoomScale,动画:true)
}否则{
scrollView.setZoomScale(scrollView.maximumZoomScale,动画:true)
}
}
}
根据。它对我很管用

func handleDoubleTap(recognizer: UITapGestureRecognizer) {
    if (scrollView.zoomScale > scrollView.minimumZoomScale) {
        scrollView.setZoomScale(scrollView.minimumZoomScale, animated: true)
    } else {
        let touchPoint = recognizer.locationInView(view)
        let scrollViewSize = scrollView.bounds.size

        let width = scrollViewSize.width / scrollView.maximumZoomScale
        let height = scrollViewSize.height / scrollView.maximumZoomScale 
        let x = touchPoint.x - (width/2.0)
        let y = touchPoint.y - (height/2.0)

        let rect = CGRectMake(x, y, width, height)
        scrollView.zoomToRect(rect, animated: true)
    }
}
根据。它对我很管用

func handleDoubleTap(recognizer: UITapGestureRecognizer) {
    if (scrollView.zoomScale > scrollView.minimumZoomScale) {
        scrollView.setZoomScale(scrollView.minimumZoomScale, animated: true)
    } else {
        let touchPoint = recognizer.locationInView(view)
        let scrollViewSize = scrollView.bounds.size

        let width = scrollViewSize.width / scrollView.maximumZoomScale
        let height = scrollViewSize.height / scrollView.maximumZoomScale 
        let x = touchPoint.x - (width/2.0)
        let y = touchPoint.y - (height/2.0)

        let rect = CGRectMake(x, y, width, height)
        scrollView.zoomToRect(rect, animated: true)
    }
}

下面是一个Swift 2.3函数,用于返回可缩放UIScrollView中触摸的位置:

  • 内部带有UIImageView的UIScrollView
  • 是否缩放-scrollView.zoomScale
  • imageView.contentMode=.ScaleSpectFit
  • 图像可以比imageView和scrollView更大、分辨率更高
  • 图像、肖像、风景或正方形的任何形状
imageView.contentMode=.ScaleSpectFit

//import AVFoundation // needed for AVMakeRectWithAspectRatioInsideRect()

func getLocationOfTouchInImageInScrollView(paintLocation:CGPoint)->CGPoint {

    let imageSize = imageViewInScrollView.image!.size
    let imageFrame = scrollView.frame
    let imageRect = AVMakeRectWithAspectRatioInsideRect(imageSize, imageFrame)
    let imageHeightToViewHeight = max(imageSize.height, imageSize.width) / imageFrame.size.height

    let px = (max(0, min(imageSize.width, ((paintLocation.x - imageRect.origin.x) * imageHeightToViewHeight))))
    let py = (max(0, min(imageSize.height, ((paintLocation.y - imageRect.origin.y ) * imageHeightToViewHeight))))
    var imageTouchPoint = CGPointMake(CGFloat(px), CGFloat(py))

    return imageTouchPoint
}

写这篇文章花了我好几天时间,因为我想不出imageHeightToViewHeight变量,因为我觉得还有其他有趣的事情发生。

这里有一个Swift 2.3函数,用于返回可缩放UIScrollView中的触摸位置:

  • 内部带有UIImageView的UIScrollView
  • 是否缩放-scrollView.zoomScale
  • imageView.contentMode=.ScaleSpectFit
  • 图像可以比imageView和scrollView更大、分辨率更高
  • 图像、肖像、风景或正方形的任何形状
imageView.contentMode=.ScaleSpectFit

//import AVFoundation // needed for AVMakeRectWithAspectRatioInsideRect()

func getLocationOfTouchInImageInScrollView(paintLocation:CGPoint)->CGPoint {

    let imageSize = imageViewInScrollView.image!.size
    let imageFrame = scrollView.frame
    let imageRect = AVMakeRectWithAspectRatioInsideRect(imageSize, imageFrame)
    let imageHeightToViewHeight = max(imageSize.height, imageSize.width) / imageFrame.size.height

    let px = (max(0, min(imageSize.width, ((paintLocation.x - imageRect.origin.x) * imageHeightToViewHeight))))
    let py = (max(0, min(imageSize.height, ((paintLocation.y - imageRect.origin.y ) * imageHeightToViewHeight))))
    var imageTouchPoint = CGPointMake(CGFloat(px), CGFloat(py))

    return imageTouchPoint
}

写这篇文章花了我好几天的时间,因为我想不出imageHeightToViewHeight变量,因为我觉得还有其他有趣的事情。

谢谢@Wei Jay发布您的答案。不幸的是,只有当
UIScrollView
包含与屏幕大小相同的内容时,这才起作用。例如,它不适用于屏幕上更宽、更高或放大的
UIImageView
。当双击较大类型的内容时,缩放到接触点是不正确的,它会放大到内容的不同部分。我要修补一下,但是如果你有任何其他建议,请更新代码?谢谢干杯。@user4806509我也在努力在Swift 3中解决这个问题。幸运吗?谢谢@Wei Jay发布您的答案。不幸的是,只有当
UIScrollView
包含与屏幕大小相同的内容时,这才起作用。例如,它不适用于屏幕上更宽、更高或放大的
UIImageView
。当双击较大类型的内容时,缩放到接触点是不正确的,它会放大到内容的不同部分。我要修补一下,但是如果你有任何其他建议,请更新代码?谢谢干杯。@user4806509我也在努力在Swift 3中解决这个问题。运气好吗?