我做了一些不太相似的事情,弹出一个高分辨率图像的 1:1 预览 you can read about here。
简而言之,我有一个peekPreviewSize,它是放大后的正方形预览的边长。然后我可以定义我的触摸位置的偏移量:
let offset = ((peekPreviewSize * imageScale) / (imageWidth * imageScale)) / 2
接下来,我计算组件边缘和它包含的图像边缘之间的距离:
let leftBorder = (bounds.width - (imageWidth * imageScale)) / 2
然后,使用触摸点的位置和这两个新值,我可以创建剪辑矩形的归一化 x 原点:
let normalisedXPosition = ((location.x - leftBorder) / (imageWidth * imageScale)) - offset
我对 y 做同样的事情,并使用这两个标准化值创建一个预览点:
let topBorder = (bounds.height - (imageHeight * imageScale)) / 2
let normalisedYPosition = ((location.y - topBorder) / (imageHeight * imageScale)) - offset
let normalisedPreviewPoint = CGPoint(x: normalisedXPosition, y: normalisedYPosition)
...传递给我的 ForceZoomPreview:
let peek = ForceZoomPreview(normalisedPreviewPoint: normalisedPreviewPoint, image: image!)
我的预览组件现在要做的工作很少。它在其构造函数(上图)中传递了规范化的原点,所以它需要做的就是使用这些值来设置图像视图的contentsRect:
imageView.layer.contentsRect = CGRect(
x: max(min(normalisedPreviewPoint.x, 1), 0),
y: max(min(normalisedPreviewPoint.y, 1), 0),
width: view.frame.width / image.size.width,
height: view.frame.height / image.size.height)