如何调整时的UIView CGAffineTransformIdentity(How to resi

2019-08-01 02:02发布

我做它有一个特点,旋转和重新大小的视图的应用程序。 我已经实现了这个功能,但我确实面临的问题。

我的问题

查看西港岛线拖动四个角的时候,调整其大小,我可以旋转在两个方向上的观点之后被调整。

一旦旋转完成,如果我再试试通过拖动其角来调整视图,该视图的大小去不可预测的价值和移动所有在屏幕上。

我GOOGLE了很多最后我得到了以下的解决方案

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

我看到了一个应用程序,它已经实施正是我希望实现的功能。

我该如何调整的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);
 }

 }

Answer 1:

既然你不使用的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(B-A) * dotProduct((C'-A), normalized(B-A)))
D' = A + (normalized(D-A) * dotProduct((C'-A), normalized(D-A)))

之后:

  • 改变你的看法身份
  • 组帧(.0f, .0f, length(AD), length(AC))
  • 集中心到(A+D)*.5f
  • 获得旋转创建视图的转换通过atanf(height/width)的“如果”,很少或填充/与那些基向量创建变换normalized(DA)normalized(BA)

你可以这样做在一个矩形内的任何一点。



文章来源: How to resize the UIView when CGAffineTransformIdentity