我有一个UIView selectFrame,有四个角手柄作为子视图。每个角手柄都有一个调用此方法的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。我已经对此进行了实验,但没有取得好成绩。
答案 0 :(得分:2)
我们在累积不同的转换方面也遇到了问题。只有平移或仅缩放或仅旋转才能正常工作。但是,如果我在平移后旋转,反之亦然,那么旋转将围绕父视图的0,0旋转视图,并且缩放会使图像漂移,如问题中所述。
以下两件事解决了我们的问题:
对于这些手势中的每一个,如果状态为UIGestureRecognizerStateBegan,我们将旋转视图的锚点设置为0.5,0.5。
view.layer.anchorPoint = CGPointMake(0.5, 0.5)
当我们翻译或缩放时,我们获取视图的当前转换,将其与新的(缩放/转换)转换连接起来,如下所示:
CGAffineTransformConcat(currentTransformation, newTransformation)
但是,在旋转的情况下,我们首先将newTransformation和currentTransformation作为第二个参数连接,如下所示:
CGAffineTransformConcat(newTransformation, currentTransformation)
请密切注意,我们通过转换连接的顺序非常重要,如documentation of CGAffineTransformConcat
中所述答案 1 :(得分:1)
我在github上建立了一个移动,旋转和缩放的项目。它仅使用CGAffineTransforms进行旋转。此项目在视图的角落处有拖动手柄,并从对角和旋转手柄调整大小。
它使用了Erica Sadun的文章Taking Charge of UIView Transforms in iOS Programming和Brad Larson's / Magnus's anchor point code。
链接到我的可调整大小项目:https://github.com/carolight/Resizable