当我缩放时,我想以正确的缩放级别从PaintCode向图像视图提供新图像

时间:2015-12-07 15:34:44

标签: ios uiscrollview uiimageview core-graphics paint-code

我有一个使用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的框架和当前比例的因子,并且在缩放时图像会跳转很多。

我做了很多研究和修补,但却无法弄清楚这一点。所以我终于在这里问了。请帮忙!谢谢你的时间。

1 个答案:

答案 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!