当您放下两根手指然后移动其中一根手指时,图像会像应该的那样展开(放大),但手指下方的像素不再位于手指下方.图像从图像中心缩放,而不是两个手指之间的中点.而这个中心点本身就在发展.我希望中心点的运动能够决定整体图像的平移.
几乎所有iOS应用程序都有相同的行为,图像放大或缩小图像中心周围而不是手指跟踪手指下方的像素?
在我看来,创建一个自定义手势识别器是解决这个问题的正确设计方法,但在我看来,有人会创建这样的识别器,以便商业免费下载和使用.有没有这样的UIGestureRecognizer?
解决方法 抱歉,这是我用于其中一个演示应用程序的代码,它可以同时捏缩放和平移,而无需使用scrollvIEw.不要忘记遵守UIGestureRecognizerDelegate协议
如果你无法同时获得捏和平移,也许是因为你错过了这种方法:
-(BOol)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{ return YES;}
这是完整的源代码:
#import "VIEwController.h"#import <QuartzCore/QuartzCore.h>@interface VIEwController ()@end@implementation VIEwController- (voID)vIEwDIDLoad{ [super vIEwDIDLoad]; // Do any additional setup after loading the vIEw,typically from a nib. isEditing = false; photoVIEw = [[UIImageVIEw alloc] initWithFrame:CGRectMake(0,320,460)]; [photoVIEw setimage:[UIImage imagenamed:@"photo.png"]]; photoVIEw.hIDden = YES; maskVIEw = [[UIImageVIEw alloc] initWithFrame:CGRectMake(0,460)]; [maskVIEw setimage:[UIImage imagenamed:@"maskguIDe.png"]]; maskVIEw.hIDden = YES; displayImage = [[UIImageVIEw alloc] initWithFrame:CGRectMake(0,460)]; UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)]; UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinch:)]; [panGesture setDelegate:self]; [pinchGesture setDelegate:self]; [photoVIEw addGestureRecognizer:panGesture]; [photoVIEw addGestureRecognizer:pinchGesture]; [photoVIEw setUserInteractionEnabled:YES]; [panGesture release]; [pinchGesture release]; btnEdit = [[UIbutton alloc] initWithFrame:CGRectMake(60,400,200,50)]; [btnEdit setBackgroundcolor:[UIcolor blackcolor]]; [btnEdit setTitle:@"Start Editing" forState:UIControlStatenormal]; [btnEdit addTarget:self action:@selector(toggleEditing) forControlEvents:UIControlEventtouchUpInsIDe]; [[self vIEw] addSubvIEw:displayImage]; [[self vIEw] addSubvIEw:photoVIEw]; [[self vIEw] addSubvIEw:maskVIEw]; [[self vIEw] addSubvIEw:btnEdit]; [self updateMaskedImage];}- (voID)vIEwDIDUnload{ [super vIEwDIDUnload]; // Release any retained subvIEws of the main vIEw.}- (BOol)shouldautorotatetoInterfaceOrIEntation:(UIInterfaceOrIEntation)interfaceOrIEntation{ return (interfaceOrIEntation != UIInterfaceOrIEntationPortraitUpsIDeDown);}-(voID)dealloc{ [btnEdit release]; [super dealloc];}#pragma mark -#pragma mark Update Masked Image Method#pragma mark --(voID)updateMaskedImage{ maskVIEw.hIDden = YES; UIImage *finalimage = [self maskImage:[self captureVIEw:self.vIEw] withMask:[UIImage imagenamed:@"mask.png"]]; maskVIEw.hIDden = NO; //UIImage *finalimage = [self maskImage:photoVIEw.image withMask:[UIImage imagenamed:@"mask.png"]]; [displayImage setimage:finalimage];}- (UIImage*) maskImage:(UIImage *)image withMask:(UIImage *)maskImage { CGImageRef maskRef = maskImage.CGImage; CGImageRef mask = CGImageMaskCreate(CGImageGetWIDth(maskRef),CGImageGetHeight(maskRef),CGImageGetBitsPerComponent(maskRef),CGImageGetBitsPerPixel(maskRef),CGImageGetBytesPerRow(maskRef),CGImageGetDataProvIDer(maskRef),NulL,false); CGImageRef masked = CGImageCreateWithMask([image CGImage],mask); return [UIImage imageWithCGImage:masked];}#pragma mark -#pragma mark touches Began#pragma mark -// adjusts the editing flag to make dragging and drop work-(voID)toggleEditing{ if(!isEditing) { isEditing = true; NSLog(@"editing..."); [btnEdit setTitle:@"Stop Editing" forState:UIControlStatenormal]; displayImage.hIDden = YES; photoVIEw.hIDden = NO; maskVIEw.hIDden = NO; } else { isEditing = false; [self updateMaskedImage]; NSLog(@"stopped editting"); [btnEdit setTitle:@"Start Editing" forState:UIControlStatenormal]; displayImage.hIDden = NO; photoVIEw.hIDden = YES; maskVIEw.hIDden = YES; }}/*-(voID)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{ if(isEditing) { UItouch *finger = [touches anyObject]; CGPoint currentposition = [finger locationInVIEw:self.vIEw]; //[maskVIEw setCenter:currentposition]; //[photoVIEw setCenter:currentposition]; if([touches count] == 1) { [photoVIEw setCenter:currentposition]; } else if([touches count] == 2) { } }}*/-(voID)handlePan:(UIPanGestureRecognizer *)recognizer{ CGPoint translation = [recognizer translationInVIEw:self.vIEw]; recognizer.vIEw.center = CGPointMake(recognizer.vIEw.center.x + translation.x,recognizer.vIEw.center.y + translation.y); [recognizer setTranslation:CGPointMake(0,0) inVIEw:self.vIEw];}-(voID)handlePinch:(UIPinchGestureRecognizer *)recognizer{ recognizer.vIEw.transform = CGAffinetransformScale(recognizer.vIEw.transform,recognizer.scale,recognizer.scale); recognizer.scale = 1;}-(BOol)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{ return YES;}#pragma mark -#pragma mark Capture Screen Function#pragma mark -- (UIImage*)captureVIEw:(UIVIEw *)yourVIEw { UIGraphicsBeginImageContextWithOptions(yourVIEw.bounds.size,yourVIEw.opaque,0.0); CGContextRef context = UIGraphicsGetCurrentContext(); [yourVIEw.layer renderInContext:context]; UIImage *image = UIGraphicsGetimageFromCurrentimageContext(); UIGraphicsEndImageContext(); return image;}#pragma mark -@end总结
以上是内存溢出为你收集整理的ios – 是否有一个手势识别器可以同时处理捏和平移?全部内容,希望文章能够帮你解决ios – 是否有一个手势识别器可以同时处理捏和平移?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)