问题描述
这是我的代码:
viewDidLoad:
viewDidLoad:
UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(pinch:)];
[self.canvas addGestureRecognizer:pinch];
pinch.delegate = self;
UIRotationGestureRecognizer *twoFingersRotate = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(pinchRotate:)];
[[self canvas] addGestureRecognizer:twoFingersRotate];
twoFingersRotate.delegate = self;
收缩和旋转代码:
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
-(void)pinchRotate:(UIRotationGestureRecognizer*)rotate
{
SMImage *selectedImage = [DataCenter sharedDataCenter].selectedImage;
switch (rotate.state)
{
case UIGestureRecognizerStateBegan:
{
selectedImage.referenceTransform = selectedImage.transform;
break;
}
case UIGestureRecognizerStateChanged:
{
selectedImage.transform = CGAffineTransformRotate(selectedImage.referenceTransform, ([rotate rotation] * 55) * M_PI/180);
break;
}
default:
break;
}
}
-(void)pinch:(UIPinchGestureRecognizer*)pinch
{
SMImage *selectedImage = [DataCenter sharedDataCenter].selectedImage;
[self itemSelected];
switch (pinch.state)
{
case UIGestureRecognizerStateBegan:
{
selectedImage.referenceTransform = selectedImage.transform;
break;
}
case UIGestureRecognizerStateChanged:
{
CGAffineTransform transform = CGAffineTransformScale(selectedImage.referenceTransform, pinch.scale, pinch.scale);
selectedImage.transform = transform;
break;
}
default:
break;
}
}
我的轮换单独工作很好,我的秤单独工作也很好,但它们不能一起工作.一个总是有效或另一个无效.当我实现 shouldRecognizeSimultaneouslyWithGestureRecognizer 时,这两个手势似乎相互对抗并产生不良结果.我错过了什么?(是的,我已经实现了 )
My rotation works great on its own and my scale works great on its own, but they wont work together. One always works or the other doesn't. When I implement shouldRecognizeSimultaneouslyWithGestureRecognizer the two gestures seem to fight against each other and produce poor results. What am I missing? (Yes I have implemented <UIGestureRecognizerDelegate>
)
推荐答案
每次调用 pinch:
时,您只需根据捏合识别器的比例来计算变换.每次调用 pinchRotate:
时,您只需根据旋转识别器的旋转计算变换.您永远不会将缩放和旋转合并为一个变换.
Every time pinch:
is called, you just compute the transform based on the pinch recognizer's scale. Every time pinchRotate:
is called, you just compute the transform based on the rotation recognizer's rotation. You never combine the scale and the rotation into one transform.
这是一种方法.给自己一个新的实例变量,_activeRecognizers
:
Here's an approach. Give yourself one new instance variable, _activeRecognizers
:
NSMutableSet *_activeRecognizers;
在viewDidLoad
中初始化:
_activeRecognizers = [NSMutableSet set];
使用一种方法作为两个识别器的动作:
Use one method as the action for both recognizers:
- (IBAction)handleGesture:(UIGestureRecognizer *)recognizer
{
SMImage *selectedImage = [DataCenter sharedDataCenter].selectedImage;
switch (recognizer.state) {
case UIGestureRecognizerStateBegan:
if (_activeRecognizers.count == 0)
selectedImage.referenceTransform = selectedImage.transform;
[_activeRecognizers addObject:recognizer];
break;
case UIGestureRecognizerStateEnded:
selectedImage.referenceTransform = [self applyRecognizer:recognizer toTransform:selectedImage.referenceTransform];
[_activeRecognizers removeObject:recognizer];
break;
case UIGestureRecognizerStateChanged: {
CGAffineTransform transform = selectedImage.referenceTransform;
for (UIGestureRecognizer *recognizer in _activeRecognizers)
transform = [self applyRecognizer:recognizer toTransform:transform];
selectedImage.transform = transform;
break;
}
default:
break;
}
}
你需要这个辅助方法:
- (CGAffineTransform)applyRecognizer:(UIGestureRecognizer *)recognizer toTransform:(CGAffineTransform)transform
{
if ([recognizer respondsToSelector:@selector(rotation)])
return CGAffineTransformRotate(transform, [(UIRotationGestureRecognizer *)recognizer rotation]);
else if ([recognizer respondsToSelector:@selector(scale)]) {
CGFloat scale = [(UIPinchGestureRecognizer *)recognizer scale];
return CGAffineTransformScale(transform, scale, scale);
}
else
return transform;
}
如果您只允许旋转和缩放,这会起作用.(我什至测试过!)
This works if you're just allowing rotating and scaling. (I even tested it!)
如果要添加平移,请使用单独的操作方法,只需调整 selectedImage.center
.尝试使用 selectedImage.transform
进行旋转和缩放平移要复杂得多.
If you want to add panning, use a separate action method and just adjust selectedImage.center
. Trying to do panning with rotation and scaling using selectedImage.transform
is much more complicated.
这篇关于iOS 捏合比例和两个手指同时旋转的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!