从角落调整旋转的UIView大小

3

我有一个 UIView 选择框,它有四个角落句柄作为子视图。每个角落句柄都有一个UIPanGestureRecognizer手势识别器,该手势识别器调用了这个方法:

这是我的代码(其中self是selectFrame UIView):

-(void)handleDrag:(UIPanGestureRecognizer *)gesture

{
    UIView *view = gesture.view;
    CGPoint translation = [gesture translationInView:view.superview];

    CGRect frame = self.bounds;

    switch (view.tag) {
        case (DRAG_HANDLE_TAG):  //upper left
            frame.size.width -= translation.x;
            frame.size.height -= translation.y;
            break;
        case (DRAG_HANDLE_TAG+1): //upper right
            frame.size.width += translation.x;
            frame.size.height -= translation.y;
            break;
        case (DRAG_HANDLE_TAG+2): //bottom left
            frame.size.width -= translation.x;
            frame.size.height += translation.y;
            break;
        case (DRAG_HANDLE_TAG+3): //bottom right
            frame.size.width += translation.x;
            frame.size.height += translation.y;
            break;
    }
    self.bounds = CGRectIntegral(frame);

    CGAffineTransform transform = self.transform;
    transform = CGAffineTransformTranslate(transform, translation.x/2, translation.y/2);
    self.transform = transform;

    [gesture setTranslation:CGPointZero inView:view.superview];

}

这段代码在没有旋转的情况下运行得非常好,但是当UIView被旋转时,它会漂移。

然而,如果我在手势结束时进行整个计算,即将

if (gesture.state != UIGestureRecognizerStateEnded)
    return;

在方法的顶部,即使旋转也能正常工作,因此代码似乎是有效的,但可能是舍入误差吗?

这个问题似乎以许多不同的方式被问到,但我找了很多小时,没有一个确切的答案。有许多可用的StickerView示例可以从中心调整大小。这个问题Resize UIView While It Is Rotated with Transform得到了非常充分的回答,但它并没有真正回答这个问题。

编辑:有很多回复建议使用三角函数,我已经尝试过了,但我认为只使用CGAffineTransforms应该是可能的。我已经进行了实验,但没有好的结果。


你能修好这个问题吗? - Ozair Kafray
还没有 - 我被其他事情分心了,但最终会回来的。希望学习一些线性代数会有所帮助! - Caroline
2个回答

3

2
我们曾经遇到过一个问题,即累计不同的变换。只有平移、缩放或旋转单独应用时才能正常工作。但是,如果我在平移后旋转或者反之,则旋转会围绕父视图的0,0旋转视图,并且缩放会像您提问中所述那样使图像漂移。
以下两点解决了我们的问题:
  1. 对于这些手势中的每一个,我们将视图的锚点设置为0.5, 0.5,如果状态为UIGestureRecognizerStateBegan。

    view.layer.anchorPoint = CGPointMake(0.5, 0.5)

  2. 当我们进行平移或缩放时,我们获取视图的当前变换,将其与新的(缩放/平移)变换连接起来,如下所示:CGAffineTransformConcat(currentTransformation, newTransformation)

    然而,在旋转的情况下,我们首先连接newTransformation和currentTransformation作为第二个参数,如下所示:CGAffineTransformConcat(newTransformation,currentTransformation)

请注意,我们传递要连接的变换的顺序很重要,正如CGAffineTransformConcat文档中所提到的那样。
另外,请仔细阅读此文以更好地了解锚点,并阅读此文理解为什么它可能与您的问题有关。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接