我有一个使用PaintCode绘制的图像。该图像具有Scale变量。在标记为“// A”的行上,我编辑了通常的PaintCode生成的代码,这样我就可以传入一个比例并以正确的高度和宽度创建图像。
public class func imageOfMap(scale scale: CGFloat = 1) -> UIImage {
UIGraphicsBeginImageContextWithOptions(
CGSizeMake(scale*1660, scale*1832), // A
false, 0)
MapStyleKit.drawMap(scale: scale)
let imageOfMap = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return imageOfMap
}
现在我在UIScrollView中有一个UIImageView。我有一个与viewController视图内部相对应的scrollview,以及使用autolayout约束限制在scrollview内部的imageview。
我查看了“viewForZooming”和“scrollViewDidZoom”,但那些只在图像视图上使用CGAffineTransformScale。我已经尝试在“scrollviewDidZoom”中设置正确的图像,我尝试使用自己的捏手势识别器,但我的数学肯定是错误的,但我不知道在哪里。
每次缩放时,我都希望以正确的缩放级别从PaintCode提供新图像的图像视图。
此外,我希望图像“保持原样”,就像捏缩放谷歌地图或Apple地图时所期望的那样。现在我正在尝试将scrollView的contentOffset乘以contentSize,scrollView的框架和当前比例的因子,并且在缩放时图像会跳转很多。
我做了很多研究和修补,但却无法弄清楚这一点。所以我终于在这里问了。请帮忙!谢谢你的时间。
答案 0 :(得分:0)
我能搞清楚了!
func scrollViewDidEndZooming(scrollView: UIScrollView, withView view: UIView?, atScale scale: CGFloat) {
let newScale: CGFloat
if scale <= scrollView.minimumZoomScale {
newScale = scrollView.minimumZoomScale
} else if scale >= scrollView.maximumZoomScale {
newScale = scrollView.maximumZoomScale
} else {
newScale = scale
}
let offset = scrollView.contentOffset
scrollView.zoomScale = 1.0
imageView.image = MapStyleKit.imageOfMap(scale: newScale)
scrollView.contentSize = contentSizeForScale(newScale)
imageView.frame = CGRect(origin: CGPointZero, size: contentSizeForScale(newScale))
scrollView.contentOffset = offset
}
func scrollViewWillBeginZooming(scrollView: UIScrollView, withView view: UIView?) {
let offset = scrollView.contentOffset
scrollView.zoomScale = imageView.scale
imageView.image = MapStyleKit.imageOfMap(scale: 1.0)
scrollView.contentSize = contentSizeForScale(1.0)
imageView.frame = CGRect(origin: CGPointZero, size: contentSizeForScale(1.0))
scrollView.contentOffset = CGPoint(x: imageView.scale*offset.x, y: imageView.scale*offset.y)
}
func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
return imageView
}
在滚动视图上设置contentOffset
之前,需要将zoomScale
保存在临时变量中
编辑:contentSizeForScale
当然会返回给定比例图像的CGSize!