【问题标题】:Implementing pinch effect on a image view in iphone在 iphone 的图像视图上实现捏合效果
【发布时间】:2011-07-14 13:16:13
【问题描述】:

提前致谢。 我想在图像视图上应用捏合、旋转和平移手势效果。像这样

    UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(scalePiece:)];
    [imgView addGestureRecognizer:pinchGesture];
    [pinchGesture release];

    UIRotationGestureRecognizer *rotationGesture = [[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(rotatePiece:)];
    [imgView addGestureRecognizer:rotationGesture];
    [rotationGesture release];

    UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panPiece:)];
    [imgView addGestureRecognizer:panGesture];
    [panGesture release];

// 方法实现

- (void)adjustAnchorPointForGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer {
    if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {
        UIView *piece = gestureRecognizer.view;
        CGPoint locationInView = [gestureRecognizer locationInView:piece];
        CGPoint locationInSuperview = [gestureRecognizer locationInView:piece.superview];

        piece.layer.anchorPoint = CGPointMake(locationInView.x / piece.bounds.size.width, locationInView.y / piece.bounds.size.height);
        piece.center = locationInSuperview;
    }
}
- (void)rotatePiece:(UIRotationGestureRecognizer *)gestureRecognizer
{
    [self adjustAnchorPointForGestureRecognizer:gestureRecognizer];

    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged) {
        [gestureRecognizer view].transform = CGAffineTransformRotate([[gestureRecognizer view] transform], [gestureRecognizer rotation]);
         NSLog(@"Rotate : %f",[gestureRecognizer rotation]);
        [gestureRecognizer setRotation:0];
    }
}
- (void)panPiece:(UIPanGestureRecognizer *)gestureRecognizer
{
    UIView *piece = [gestureRecognizer view];

    [self adjustAnchorPointForGestureRecognizer:gestureRecognizer];

    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged) {
        CGPoint translation = [gestureRecognizer translationInView:[piece superview]];

        [piece setCenter:CGPointMake([piece center].x + translation.x, [piece center].y + translation.y)];
        [gestureRecognizer setTranslation:CGPointZero inView:[piece superview]];
    }
}

- (void)scalePiece:(UIPinchGestureRecognizer *)gestureRecognizer
{
    [self adjustAnchorPointForGestureRecognizer:gestureRecognizer];

    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged) {
        [gestureRecognizer view].transform = CGAffineTransformScale([[gestureRecognizer view] transform], [gestureRecognizer velocity], [gestureRecognizer velocity]);
        [gestureRecognizer setScale:1];
    }
}

在这种旋转和滑动(平移)中工作正常,但捏不好。我见过一个应用程序,即 http://itunes.apple.com/us/app/image-mask-costume-hd/id443821357?mt=8 在这个触摸事件非常好。我想通过使用手势来实现这样的实现,或者我们需要跟随触摸事件。有没有人有想法请帮我做。

【问题讨论】:

    标签: iphone uigesturerecognizer touch-event


    【解决方案1】:

    试试这个代码:http://dl.dropbox.com/u/9397784/Image%20multitouch.txt

    用你的观点替换currentlyEditing。只需将代码复制到要在其中使用它的视图或视图控制器的实现中。代码处理缩放、旋转和平移。要将视图重置回默认位置,请致电yourView.transform = CGAffineTransformIdentity;。

    【讨论】:

    • 该方法不使用手势识别器,而是直接处理触摸事件。我发现这样做更容易。放入后,所有其他对象(按钮等)仍应响应触摸。
    • 感谢您的回复。是的,这正是我想要的。在这一切工作正常,但是如果我在 x 或 y 方向上捏捏效果,我想增加或减少视图该方向的尺寸仅表示宽度或高度,而不是在两个方向上缩放。我想你明白我的意思。如果从应用商店下载 img mask 示例后不清楚,请检查一次。
    • 我明白你的意思。让我检查一下代码,看看哪里可以更改。
    • 使用这一行:CGAffineTransform newTransform2 = CGAffineTransformScale(currentlyEditing.transform, (curPoint1.x - curPoint2.x) / (prevPoint1.x - prevPoint2.x), (curPoint1.y - curPoint2.y) / (prevPoint1.y - prevPoint2.y)); 而不是设置newTransform2 的当前行。这是未经测试的,但应该可以工作。
    • 试试这个:CGAffineTransformScale(currentlyEditing.transform, abs(curPoint1.x - curPoint2.x) / abs(prevPoint1.x - prevPoint2.x), abs(curPoint1.y - curPoint2.y) / abs(prevPoint1.y - prevPoint2.y));
    【解决方案2】:

    苹果Touches example 建议使用[gestureRecognizer scale] 而不是[gestureRecognizer velocity]:

    - (IBAction)scalePiece:(UIPinchGestureRecognizer *)gestureRecognizer
    {
        [self adjustAnchorPointForGestureRecognizer:gestureRecognizer];
    
        if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged) {
            [gestureRecognizer view].transform = CGAffineTransformScale([[gestureRecognizer view] transform], [gestureRecognizer scale], [gestureRecognizer scale]);
            [gestureRecognizer setScale:1];
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-28
      • 2012-01-14
      • 2014-03-08
      • 1970-01-01
      • 2016-10-05
      • 2012-08-05
      • 2012-05-24
      • 1970-01-01
      相关资源
      最近更新 更多