使用 CATransform3DMakeRotation 左右旋转 UIView
Posted
技术标签:
【中文标题】使用 CATransform3DMakeRotation 左右旋转 UIView【英文标题】:Rotate a UIView left and right with CATransform3DMakeRotation 【发布时间】:2011-12-04 03:05:43 【问题描述】:在我的应用程序中,我使用 CATransform3DMakeRotation 来旋转 UIView,在其上移动手指,尝试想象一个旋钮。 我的问题是一切运行良好,移动随心所欲,但是当我触摸它而不是开始旋转时,它会在中心旋转 180 度,我不明白为什么。
我给你看我的代码:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
if (Tag ==subView.tag)
CGPoint Location = [[touches anyObject] locationInView:subView.superview];
int x = subView.center.x;
int y = subView.center.y;
float dx = Location.x - x;
float dy = Location.y - y;
double a = atan2f(-dx, dy);
subView.layer.position = subView.center;
subView.layer.transform = CATransform3DMakeRotation(a, 0, 0, 1);
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
if (Tag ==subView.tag)
[self touchesBegan:touches withEvent:event];
编辑:这里我如何解决问题
CGPoint Location = [withTheTouch locationInView:theViewToRotate.superview];
NSLog(@"location x%f",Location.x);
NSLog(@"location y%f",Location.y);
int x = theViewToRotate.center.x;
int y = theViewToRotate.center.y;
NSLog(@" X %i",x);
NSLog(@" Y %i",y);
float dy;
float dx;
if (Location.y < theViewToRotate.center.y)
dx = x- Location.x;
dy = y- Location.y;
NSLog(@"dx %f",dx);
NSLog(@"dy %f",dy);
NSLog(@"sopra il View.Center");
else
dx = Location.x - x;
dy = Location.y - y;
NSLog(@"sotto il View.Center");
float ang = atan2(-dx, dy);
NSLog(@"anchorPoint %@",NSStringFromCGPoint(theViewToRotate.layer.anchorPoint));
NSLog(@"Position %@",NSStringFromCGPoint(theViewToRotate.layer.position));
NSLog(@"angle %f",ang);
//theViewToRotate.layer.position = theViewToRotate.center;
if(ang)
theViewToRotate.layer.transform = CATransform3DMakeRotation(ang, 0, 0, 1); //ruoto sul vettore Z
else
//theViewToRotate.frame = CGRectMake(theViewToRotate.frame.origin.x, theViewToRotate.frame.origin.y , theViewToRotate.frame.size.width, theViewToRotate.frame.size.height );
问题出在我在视图中触摸的点上。
现在我需要了解如何锁定两个角度之间的旋转。我没有 360° 旋转。
【问题讨论】:
【参考方案1】:您好,发生这种情况的原因是视图本身具有现有的旋转。您需要获取当前旋转并从那里开始旋转。
你所做的总是从这里开始 CATransform3DMakeRotation(a, 0, 0, 1);
它有自己的预定义旋转。因此,当您触摸它时会发生 180 度偏移。如果您从当前视图的旋转开始旋转,则不会发生这种情况。
希望对你有帮助
【讨论】:
以上是关于使用 CATransform3DMakeRotation 左右旋转 UIView的主要内容,如果未能解决你的问题,请参考以下文章
在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?
Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)