ios - 如何准确放大捏合手势的特定点(多次捏合)?

标签 ios objective-c matrix uigesturerecognizer transformation

我正在尝试在我的 iOS 应用程序中缩放四边形。它需要缩放的不是基于四边形的中心,而是基于捏合的质心。

我能够正确地做到这一点 - 但仅限于第一个捏合手势。在随后的捏合手势中,它可以工作,但它会有点漂移并且看起来不太准确。我不知道该怎么做。

有一些关于这个的问题,我已经经历了大部分,如果不是全部的话。他们都没有准确地解决我的问题。

另请注意,我正在缩放和平移四边形(呈现为 GLKView),而不是 View 本身。我见过的大多数解决方案都是直接转换 View 。

这是捏合手势和处理的代码:
首先在 viewDidLoad 中:

UIPinchGestureRecognizer *pinchRecognizer = [[UIPinchGestureRecognizer alloc]
                                             initWithTarget:self action:@selector(respondToPinchGesture:)];
pinchRecognizer.cancelsTouchesInView = YES;
pinchRecognizer.delaysTouchesEnded = NO;
[glView addGestureRecognizer:pinchRecognizer];

其中 glView 是一个 GLKView 对象。
和处理程序:
- (IBAction)respondToPinchGesture:(UIPinchGestureRecognizer *)recognizer{

    if (recognizer.state == UIGestureRecognizerStateEnded || [recognizer numberOfTouches] < 2) return;

    if (recognizer.state == UIGestureRecognizerStateBegan) {
        point = [recognizer locationInView:glView];
        point.x *= glView.contentScaleFactor;
        point.y *= glView.contentScaleFactor;
        point.y = height - point.y;

        anchor = GLKVector3Make(point.x, point.y, 0);
        lastScale = 1.0;
    }

    if (fabs(recognizer.scale - lastScale) > 0.01){

        GLfloat scale = 1.0 - (lastScale - recognizer.scale);
        lastScale = recognizer.scale;

        new_anchor_point = anchor;
        new_anchor_point = GLKVector3MultiplyScalar(new_anchor_point, scale);
        GLKVector3 translate = GLKVector3Subtract(anchor, new_anchor_point);

        path.transform = GLKMatrix4TranslateWithVector3(path.transform, translate);
        path.transform = GLKMatrix4Scale(path.transform, scale, scale, 0);

        cumulative_translate = GLKVector3Add(cumulative_translate, translate);
    }

}

任何指针表示赞赏。我已经 2 天了,即使是一个模糊的建议也可能会有所帮助。

最佳答案

你必须

  • 记住之前在 RecognizerStateBegan 上的变换矩阵,
  • 假设 View 或对象之前没有被转换过,为捏缩放构建新的转换矩阵。
  • 然后,将两个矩阵连接在一起。这将是您转换对象或 View 的最终矩阵。
  • 关于ios - 如何准确放大捏合手势的特定点(多次捏合)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23401360/

    相关文章:

    ios - 将 token 发送到后端 strip objective-c

    Java二维输出矩阵

    matrix - 在 Racket 中寻找 'map' 的澄清

    iphone - Insert 语句不检查重复值

    ios - UIView 作为 subview 方向框架问题

    ios - 如何在 iOS、Swift 中更改底部布局约束

    objective-c - 计算文件中的换行数

    c++ - Eigen 库 - 伪逆矩阵(Matlab - pinv)

    ios - 打开和关闭自动更正类型 (UITextView)

    ios sqlite api 文档