How to implement different GestureRecognizer on same image views?
I am implementing the rotation,pich,tap gesture recognizers in my app.I have an image view where i get the user image,then there is button to move to the stamps view,where there are 120 scrollable stamp images of 1000*100.The problem is that when i choose one stampimage,the gesture works fine.But when i again move to the stamp view and choose stamp,the first one stamp become static and does not recognize any gesture,only the current stamp recognize the gesture. What i am performing is to select multiple stamps and then i can rotate them,strech them,pinch them. Here is the code which i am implementing.Just help me how to acheive this...
-(void)viewWillAppear:(BOOL)animated
{
if (stampImageView) {
[stampImageView release];
}
stampImageView=[[UIImageView alloc]initWithFrame:CGRectMake(self.view.center.x-100, 200, 80, 80)];
stampImageView.tag=(int)mAppDel.frameImageString;
NSLog(@"tag is %@",stampImageView.tag);
stampImageView.userInteractionEnabled=YES;
if(mAppDel.frameImageString)
stampImageView.image=[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:mAppDel.frameImageString ofType:@"png"]];
[self.view addSubview:stampImageView];
stampImageView.userInteractionEnabled=YES;
[self.view bringSubviewToFront:stampImageView];
UIRotationGestureRecognizer *rotationGesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotatePiece:)];
[stampImageView addGestureRecognizer:rotationGesture];
[rotationGesture release];
UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scalePiece:)];
[pinchGesture setDelegate:self];
[stampImageView addGestureRecognizer:pinchGesture];
[pinchGesture release];
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panPiece:)];
[panGesture setMaximumNumb开发者_StackOverflowerOfTouches:1];
[panGesture setDelegate:self];
[stampImageView addGestureRecognizer:panGesture];
[panGesture release];
}
Did u try using the delegate method
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;
I implement this logic for monotouch but you can use it in you app
void AddGestureRecognizersToImage (UIImageView imgView)
{
imgView.UserInteractionEnabled = true;
// rotate the images
var rotationGesture = new UIRotationGestureRecognizer (this, new Selector ("RotateImage"));
imgView.AddGestureRecognizer (rotationGesture);
// Zoom the image
var pinchGesture = new UIPinchGestureRecognizer (this, new Selector ("ScaleImage"));
//pinchGesture.Enabled = true;
pinchGesture.Delegate = new GestureDelegate (this);
imgView.AddGestureRecognizer (pinchGesture);
var panGesture = new UIPanGestureRecognizer(this, new Selector ("PanImage"));
//panGesture.Enabled = true;
panGesture.MaximumNumberOfTouches = 2;
panGesture.Delegate = new GestureDelegate (this);
imgView.AddGestureRecognizer (panGesture);
var longPressGesture = new UILongPressGestureRecognizer (this, new Selector ("ShowResetMenu"));
imgView.AddGestureRecognizer (longPressGesture);
}
void AdjustAnchorPointForGestureRecognizer (UIGestureRecognizer gestureRecognizer)
{
if (gestureRecognizer.State == UIGestureRecognizerState.Began)
{
var image = gestureRecognizer.View;
var locationInView = gestureRecognizer.LocationInView (image);
var locationInSuperview = gestureRecognizer.LocationInView (image.Superview);
image.Layer.AnchorPoint = new PointF (locationInView.X / image.Bounds.Size.Width, locationInView.Y / image.Bounds.Size.Height);
image.Center = locationInSuperview;
}
}
[Export("RotateImage")]
void RotateImage (UIRotationGestureRecognizer gestureRecognizer)
{
AdjustAnchorPointForGestureRecognizer (gestureRecognizer);
if (gestureRecognizer.State == UIGestureRecognizerState.Began || gestureRecognizer.State == UIGestureRecognizerState.Changed)
{
gestureRecognizer.View.Transform *= CGAffineTransform.MakeRotation (gestureRecognizer.Rotation);
// Reset the gesture recognizer's rotation - the next callback will get a delta from the current rotation.
gestureRecognizer.Rotation = 0;
}
}
// Zoom the image by the current scale
[Export("ScaleImage")]
void ScaleImage (UIPinchGestureRecognizer gestureRecognizer)
{
AdjustAnchorPointForGestureRecognizer (gestureRecognizer);
if (gestureRecognizer.State == UIGestureRecognizerState.Began || gestureRecognizer.State == UIGestureRecognizerState.Changed)
{
gestureRecognizer.View.Transform *= CGAffineTransform.MakeScale (gestureRecognizer.Scale, gestureRecognizer.Scale);
// Reset the gesture recognizer's scale - the next callback will get a delta from the current scale.
gestureRecognizer.Scale = 1;
}
}
// Shift the image's center by the pan amount
[Export("PanImage")]
void PanImage (UIPanGestureRecognizer gestureRecognizer)
{
gestureRecognizer.Enabled = true;
AdjustAnchorPointForGestureRecognizer (gestureRecognizer);
var image = gestureRecognizer.View;
if (gestureRecognizer.State == UIGestureRecognizerState.Began || gestureRecognizer.State == UIGestureRecognizerState.Changed)
{
var translation = gestureRecognizer.TranslationInView (this.window);
gestureRecognizer.View.Center = new PointF (gestureRecognizer.View.Center.X + translation.X, gestureRecognizer.View.Center.Y + translation.Y);
//image.Center = new PointF (image.Center.X + translation.X, image.Center.Y + translation.Y);
// Reset the gesture recognizer's translation to {0, 0} - the next callback will get a delta from the current position.
gestureRecognizer.SetTranslation (PointF.Empty, image);
}
}
精彩评论