【问题标题】:detect rotate gesture and scale gesture iphone sdk检测旋转手势和缩放手势iphone sdk
【发布时间】:2010-07-12 11:53:30
【问题描述】:

我想旋转 uiimageview 并缩放图像视图,那么我如何检测用户正在缩放或用户正在旋转的触摸手势?

【问题讨论】:

    标签: iphone uiimageview touch


    【解决方案1】:

    从 iOS 3.2 开始,Apple 引入了UIGestureRecognizer 的使用。您会感兴趣的两个是UIPinchGestureRecognizerUIRotationGestureRecognizer。要使用捏合手势,您可以执行以下操作:

    - (void)viewDidLoad {
        UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handlePinchGesture:)];
        [imageView addGestureRecognizer:pinch];
        [pinch release];
    }
    
    - (void)handlePinchGesture:(UIGestureRecognizer *)sender {
        NSLog(@"New Scale: %f", sender.scale);
    }
    

    你可以为UIRotationGestureRecognizer 做类似的事情。

    【讨论】:

    • NSLog(@"New Scale: %f", sender.scale);它在编译时也会出错,像这样“错误:在非结构或联合的东西中请求成员‘规模’”
    • 我想在不使用 UIGestureRecognizer 的情况下做到这一点,有没有办法在 touchMoved 上做到这两点?
    • 在touchMoved中可以做,但是会比较复杂。您将需要获取触摸的位置并为这些触摸创建一个边界框。然后您可以根据该边界矩形缩放图像视图。
    • 你能告诉我怎么做吗?这可能很复杂,但并非不可能......
    【解决方案2】:

    在你的 viewcontroller.h 文件中写下这个属性

    IBOutlet UIImageView *imgRotate;
    CGFloat lastScale;
    CGFloat lastRotation;
    

    现在在您的 viewcontroller.m 文件中写入以下代码,

    - (void)viewDidLoad
    {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    
    UIPinchGestureRecognizer *pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scale:)];
    [pinchRecognizer setDelegate:self];
    [imgRotate addGestureRecognizer:pinchRecognizer];
    
    UIRotationGestureRecognizer *rotationRecognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotate:)];
    [rotationRecognizer setDelegate:self];
    [imgRotate addGestureRecognizer:rotationRecognizer];
    }
    
    -(void)scale:(id)sender
    {
    if([(UIPinchGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded)
    {
        lastScale = 1.0;
        return;
    }
    
    CGFloat scale = 1.0 - (lastScale - [(UIPinchGestureRecognizer*)sender scale]);
    
    CGAffineTransform currentTransform = [(UIPinchGestureRecognizer*)sender view].transform;
    CGAffineTransform newTransform = CGAffineTransformScale(currentTransform, scale, scale);
    
    [[(UIPinchGestureRecognizer*)sender view] setTransform:newTransform];
    
    [imgRotate setTransform:newTransform];
    lastScale = [(UIPinchGestureRecognizer*)sender scale];
    }
    
    -(void)rotate:(id)sender
    {
    if([(UIRotationGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded)
    {
        lastRotation = 0.0;
        return;
    }
    
    CGFloat rotation = 0.0 - (lastRotation - [(UIRotationGestureRecognizer*)sender rotation]);
    
    CGAffineTransform currentTransform = [(UIPinchGestureRecognizer*)sender view].transform;
    CGAffineTransform newTransform = CGAffineTransformRotate(currentTransform,rotation);
    
    [[(UIRotationGestureRecognizer*)sender view] setTransform:newTransform];
    
    [imgRotate setTransform:newTransform];
    lastRotation = [(UIRotationGestureRecognizer*)sender rotation];
    }
    
    -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
    {
    UITouch *touch = [touches anyObject];
    
    if ([touch view] == imgRotate) {
        CGPoint location = [touch locationInView:self.view];
        imgRotate.center = location;
    }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-08-13
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      • 2010-11-21
      • 2018-12-02
      • 2020-10-03
      • 2011-02-10
      • 1970-01-01
      相关资源
      最近更新 更多