ios – 是否有一个手势识别器可以同时处理捏和平移?

ios – 是否有一个手势识别器可以同时处理捏和平移?,第1张

概述所以我正在使用iOS 4.2来为我的应用程序添加缩放和平移.我已经实现了UIPinchGestureRecognizer和UIPanGestureRecognizer的实例.在我看来,其中只有一个是一次识别一个手势.特别地,后者仅在一个手指向下时作出反应,而前者在第二手指存在时作出反应.这没关系,但它有一些副作用,我认为这会产生低劣的用户体验质量. 当您放下两根手指然后移动其中一根手指时,图像会像 所以我正在使用iOS 4.2来为我的应用程序添加缩放和平移.我已经实现了UIPinchGestureRecognizer和UIPanGestureRecognizer的实例.在我看来,其中只有一个是一次识别一个手势.特别地,后者仅在一个手指向下时作出反应,而前者在第二手指存在时作出反应.这没关系,但它有一些副作用,我认为这会产生低劣的用户体验质量.

当您放下两根手指然后移动其中一根手指时,图像会像应该的那样展开(放大),但手指下方的像素不再位于手指下方.图像从图像中心缩放,而不是两个手指之间的中点.而这个中心点本身就在发展.我希望中心点的运动能够决定整体图像的平移.

几乎所有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 – 是否有一个手势识别器可以同时处理捏和平移?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1007080.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存