Ios 从用户';s与Swift中的UIScrollView的接触点
下面的Swift代码管理在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!
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更大、分辨率更高
- 图像、肖像、风景或正方形的任何形状
//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更大、分辨率更高
- 图像、肖像、风景或正方形的任何形状
//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中解决这个问题。运气好吗?