如何在CGAffineTransformIdentity时调整UIView的大小

我正在做一个应用程序,它具有旋转和重新调整视图大小的function。 我已实现此function,但我确实遇到了问题。

我的问题

拖动四个角时,视图将被resize,resize后我可以在两个方向上旋转视图。

旋转完成后,如果我再次尝试通过拖动其角来调整视图大小,则视图的大小会变为不可预测的值并且会在屏幕上移动。

我google了很多,最后我得到了以下解决方案

The frame property is undefined when transform != CGAffineTransformIdentity, as per the docs on UIView 

我看到一个应用程序已经实现了我想要实现的function。

如何在旋转UIView后调整UIView的大小

我的代码用于调整视图大小

触动开始

 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ UITouch *touch = [[event allTouches] anyObject]; NSLog(@"[touch view]:::%@",[touch view]); touchStart = [[touches anyObject] locationInView:testVw]; isResizingLR = (testVw.bounds.size.width - touchStart.x < kResizeThumbSize && testVw.bounds.size.height - touchStart.y < kResizeThumbSize); isResizingUL = (touchStart.x <kResizeThumbSize && touchStart.y <kResizeThumbSize); isResizingUR = (testVw.bounds.size.width-touchStart.x < kResizeThumbSize && touchStart.y<kResizeThumbSize); isResizingLL = (touchStart.x <kResizeThumbSize && testVw.bounds.size.height -touchStart.y <kResizeThumbSize); } 

触动了

 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ CGPoint touchPoint = [[touches anyObject] locationInView:testVw]; CGPoint previous=[[touches anyObject]previousLocationInView:testVw]; float deltaWidth = touchPoint.x-previous.x; float deltaHeight = touchPoint.y-previous.y; NSLog(@"CVTM:%@",NSStringFromCGRect(testVw.frame)); if (isResizingLR) { testVw.frame = CGRectMake(testVw.frame.origin.x, testVw.frame.origin.y,touchPoint.x + deltaWidth, touchPoint.y + deltaWidth); } if (isResizingUL) { testVw.frame = CGRectMake(testVw.frame.origin.x + deltaWidth, testVw.frame.origin.y + deltaHeight, testVw.frame.size.width - deltaWidth, testVw.frame.size.height - deltaHeight); } if (isResizingUR) { testVw.frame = CGRectMake(testVw.frame.origin.x ,testVw.frame.origin.y + deltaHeight, testVw.frame.size.width + deltaWidth, testVw.frame.size.height - deltaHeight); } if (isResizingLL) { testVw.frame = CGRectMake(testVw.frame.origin.x + deltaWidth ,testVw.frame.origin.y , testVw.frame.size.width - deltaWidth, testVw.frame.size.height + deltaHeight); } if (!isResizingUL && !isResizingLR && !isResizingUR && !isResizingLL) { testVw.center = CGPointMake(testVw.center.x + touchPoint.x - touchStart.x,testVw.center.y + touchPoint.y - touchStart.y); } } 

由于您不使用UIView动画,您可以保存当前视图的变换,将视图的变换设置为标识,调整视图大小并重新应用保存的变换:

 UIView *v; CGAffineTransform t = v.transform; v.transform = CGAffineTransformIdentity; CGFloat scale = 2.0f; v.frame = CGRectMake(v.frame.origin.x, v.frame.origin.y, v.frame.size.width*scale , v.frame.size.height*scale); v.transform = t; 

(编辑)关于你的大小调整:

如果你定义你的矩形有4个向量(点)A,B,C,D其中(A+C)*.5 = (B+D)*.5 = rectangle_center然后移动点C到位置C’也会移动B和D到B’和D’:

 A' = A C' = C' //touch input B' = A + (normalized(BA) * dotProduct((C'-A), normalized(BA))) D' = A + (normalized(DA) * dotProduct((C'-A), normalized(DA))) 

之后:

  • 将您的观点转变为身份
  • 将帧设置为(.0f, .0f, length(AD), length(AC))
  • 将中心设置为(A+D)*.5f
  • 获得旋转以通过atanf(height/width)创建视图变换,并使用normalized(DA)normalized(BA)基本向量填充/创建变换

您可以对矩形中的任何点执行此操作。