1

我有一张使用 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 视图的内部,并将图像视图限制在滚动视图的内部。

我查看了“viewForZooming”和“scrollViewDidZoom”,但它们只在图像视图上使用 CGAffineTransformScale。我尝试在“scrollviewDidZoom”中设置正确的图像,并尝试使用自己的捏合手势识别器,但我的数学在某些地方一定是错误的,但我不知道在哪里。

每次缩放时,我都想以正确的缩放级别从 PaintCode 的图像视图中提供一个新图像。

此外,我希望图像“保持原位”,就像人们在捏放大 Google Maps 或 Apple Maps 时所期望的那样。现在我正在尝试将scrollView的contentOffset乘以contentSize、scrollView的框架和当前比例,并且在缩放时图像会跳动很多。

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

4

1 回答 1

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 !

于 2015-12-10T00:06:03.950 回答