我创建了一个UIView,应用UIPanGestureRecognizer,用一根手指旋转,也用一根手指增加和减少它的框架。
- 旋转视图放在UIView的左下角。
- 调整视图大小放在UIView的右下角。
让我写下其中的一些代码行。
//Rotate Apply with Pan Gesture
panRotateGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(rotateViewPanGesture:)];
[rotateView addGestureRecognizer:panRotateGesture];
//Resize View Apply with Pan Gesture
panResizeGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(resizeTranslate:)];
[resizeView addGestureRecognizer:panResizeGesture];
[panRotateGesture requireGestureRecognizerToFail:panResizeGesture];
这是使用一根手指的UIPanGesture调整视图大小的方法。
-(void)resizeTranslate:(UIPanGestureRecognizer *)recognizer
{
if ([recognizer state]== UIGestureRecognizerStateBegan)
{
prevPoint = [recognizer locationInView:self.superview];
[self setNeedsDisplay];
}
else if ([recognizer state] == UIGestureRecognizerStateChanged)
{
if (self.frame.size.width < kFixW)
{
self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, kFixW, self.frame.size.height);
}
if(self.frame.size.height < kFixH)
{
self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, kFixH);
}
CGPoint point = [recognizer locationInView:self.superview];
float wChange = 0.0, hChange = 0.0;
wChange = (point.x - prevPoint.x); //Slow down increment
hChange = (point.y - prevPoint.y); //Slow down increment
self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width + (wChange), self.frame.size.height + (hChange));
NSLog(@"self.frame : %@",NSStringFromCGRect(self.frame));
prevPoint = [recognizer locationInView:self.superview];
[self setNeedsDisplay];
}
else if ([recognizer state] == UIGestureRecognizerStateEnded)
{
prevPoint = [recognizer locationInView:self.superview];
[self setNeedsDisplay];
}
}
在这里,如果用于旋转UIView与UIPan手势与一根手指
-(void)rotateViewPanGesture:(UIPanGestureRecognizer *)recognizer
{
if ([recognizer state] == UIGestureRecognizerStateBegan)
{
deltaAngle = atan2([recognizer locationInView:self].y-self.center.y, [recognizer locationInView:self].x-self.center.x);
startTransform = self.transform;
}
else if ([recognizer state] == UIGestureRecognizerStateChanged)
{
float ang = atan2([recognizer locationInView:self.superview].y - self.center.y, [recognizer locationInView:self.superview].x - self.center.x);
float angleDiff = deltaAngle - ang;
self.transform = CGAffineTransformMakeRotation(-angleDiff);
[self setNeedsDisplay];
}
else if ([recognizer state] == UIGestureRecognizerStateEnded)
{
float ang = atan2([recognizer locationInView:self.superview].y - self.center.y, [recognizer locationInView:self.superview].x - self.center.x);
deltaAngle = atan2([recognizer locationInView:self].y-self.center.y, [recognizer locationInView:self].x-self.center.x);
startTransform = self.transform;
[self setNeedsDisplay];
}
}
现在的问题是,调整大小和旋转手势都可以正常工作。
当我使用panResizeGesture调整视图大小时,它可以正常工作,但是如果我应用一次panRotateGesture并且想要应用panResizeGesture,它会退出屏幕并且无法正常工作。
请提出解决此问题的任何想法。
多谢。
文档清楚地说:
**如果转换属性不是标识转换,则此属性的值未定义,因此应忽略。
如果转换属性包含非标识转换,则帧属性的值未定义,不应修改。在这种情况下,您可以使用 center 属性重新定位视图,并改用 bounds 属性调整大小。
所以,只需在rotateViewPanGesture方法中将self.frame更改为self.bounds
例如
self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, kFixH);
自:
self.bounds = CGRectMake(self.bounds.origin.x, self.bounds.origin.y, self.bounds.size.width, kFixH);
你的代码将完美地工作。
更新
我附上了使用您的代码的示例项目。 您可以使用此代码答
这有点晚了,所以也许你已经想通了,但你的问题出在 locationInView 期间:你的代码的一部分。 您正在尝试计算您尝试旋转的实际视图的位置在视图中,而您确实要计算超级视图的位置在视图中。
-(void)rotateViewPanGesture:(UIPanGestureRecognizer *)recognizer{
if ([recognizer state] == UIGestureRecognizerStateBegan)
{
deltaAngle = atan2([recognizer locationInView:self.superview].y-self.center.y, [recognizer locationInView:self.superview].x-self.center.x); //here change it to self.superview
startTransform = self.transform;
}
else if ([recognizer state] == UIGestureRecognizerStateChanged)
{
float ang = atan2([recognizer locationInView:self.superview].y - self.center.y, [recognizer locationInView:self.superview].x - self.center.x);
float angleDiff = deltaAngle - ang;
self.transform = CGAffineTransformMakeRotation(-angleDiff);
[self setNeedsDisplay];
}
else if ([recognizer state] == UIGestureRecognizerStateEnded)
{
float ang = atan2([recognizer locationInView:self.superview].y - self.center.y, [recognizer locationInView:self.superview].x - self.center.x);
deltaAngle = atan2([recognizer locationInView:self.superview].y-self.center.y, [recognizer locationInView:self.superview].x-self.center.x); //here change it to locationInView:self.superview
startTransform = self.transform;
[self setNeedsDisplay];
}}