gpt4 book ai didi

ios - 使用捏合手势;我怎样才能放大到用户手指实际 "pinch"的位置?

转载 作者:技术小花猫 更新时间:2023-10-29 10:40:55 30 4
gpt4 key购买 nike

我已经在我的应用程序的 UIImageView 上实现了 UIPinchGestureRecognizer,但是无论我在图像上的哪个位置捏合,它似乎都会放大到同一个位置。有谁知道我如何让它放大到用户实际“捏”的地方?请参阅下面的代码。

ViewController.m

 - (IBAction)scaleImage:(UIPinchGestureRecognizer *)recognizer {

recognizer.view.transform = CGAffineTransformScale(recognizer.view.transform, recognizer.scale, recognizer.scale);
recognizer.scale = 1;

}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;
{
BOOL shouldReceiveTouch = YES;

if (gestureRecognizer == tap) {
shouldReceiveTouch = (touch.view == featureImage);
}
return shouldReceiveTouch;
}

最佳答案

比例变换保持原点 (0, 0) 不变。因此,要围绕特定点缩放 View ,您必须首先将该点平移到原点,然后应用缩放,然后再平移回来。

- (IBAction)pinchGestureDidFire:(UIPinchGestureRecognizer *)pinch {

首先,我们得到被压缩的 View 。

    UIView *pinchView = pinch.view;

为了计算夹点的中心,我们需要 View 边界的中点,所以我们也得到了边界:

    CGRect bounds = pinchView.bounds;

中心基于捏合触摸的质心,我们通过这种方式获得:

    CGPoint pinchCenter = [pinch locationInView:pinchView];

但我们实际上需要相对于 View 中心的收缩偏移,因为默认情况下 View 的变换是相对于 View 中心的。 (您可以通过更改 View 的 layer.anchorPoint 来更改它。)

    pinchCenter.x -= CGRectGetMidX(bounds);
pinchCenter.y -= CGRectGetMidY(bounds);

现在我们可以更新 View 的转换。首先我们得到它的当前变换:

    CGAffineTransform transform = pinchView.transform;

然后我们更新它以将夹点中心平移到原点:

    transform = CGAffineTransformTranslate(transform, pinchCenter.x, pinchCenter.y);

现在我们可以应用比例:

    CGFloat scale = pinch.scale;
transform = CGAffineTransformScale(transform, scale, scale);

然后我们将 View 翻译回来:

    transform = CGAffineTransformTranslate(transform, -pinchCenter.x, -pinchCenter.y);

现在我们可以使用修改后的转换更新 View :

    pinchView.transform = transform;

最后,我们重置手势识别器的比例,因为我们已经应用了当前比例:

    pinch.scale = 1.0;
}

演示:

pinch scale

请注意,在模拟器中,您可以按住选项 (alt) 进行捏合手势。按住 shift(同时按住 option)将两个触摸移动到一起。

下面是复制/粘贴的全部代码:

- (IBAction)pinchGestureDidFire:(UIPinchGestureRecognizer *)pinch {
UIView *pinchView = pinch.view;
CGRect bounds = pinchView.bounds;
CGPoint pinchCenter = [pinch locationInView:pinchView];
pinchCenter.x -= CGRectGetMidX(bounds);
pinchCenter.y -= CGRectGetMidY(bounds);
CGAffineTransform transform = pinchView.transform;
transform = CGAffineTransformTranslate(transform, pinchCenter.x, pinchCenter.y);
CGFloat scale = pinch.scale;
transform = CGAffineTransformScale(transform, scale, scale);
transform = CGAffineTransformTranslate(transform, -pinchCenter.x, -pinchCenter.y);
pinchView.transform = transform;
pinch.scale = 1.0;
}

关于ios - 使用捏合手势;我怎样才能放大到用户手指实际 "pinch"的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25859069/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com