UIPanGestureRecognizer和UIPinchGestureRecogizer用于放大和移动反弹回拉动画

时间:2014-06-25 11:57:59

标签: ios objective-c uiimageview uipangesturerecognizer

我在UIView中有UIImageView。 请假设用户只能缩放(不在此代码中)。 如果uiimage比UIView更大,我需要动画来拉回uiimage,就像在facebook app中一样。

意思是,如果用户向上移动UIImageView ..当他抬起手指时,UIImageView会被拉回以覆盖底部的空白区域。

我试着玩它,但是......没有运气。 提前谢谢

-(void)pinchGestureDetected:(UIPinchGestureRecognizer *)recognizer
{

    UIGestureRecognizerState state = [recognizer state];

    if (state == UIGestureRecognizerStateBegan || state == UIGestureRecognizerStateChanged)
    {

        CGFloat scale = [recognizer scale];



        [recognizer.view setTransform:CGAffineTransformScale(recognizer.view.transform, scale, scale)];

        [recognizer setScale:1.0];
    }


   }
- (void)panGestureDetected:(UIPanGestureRecognizer *)recognizer
{
    UIGestureRecognizerState state = [recognizer state];

    if (state == UIGestureRecognizerStateBegan || state == UIGestureRecognizerStateChanged)
    {
        CGPoint translation = [recognizer translationInView:recognizer.view];
        [recognizer.view setTransform:CGAffineTransformTranslate(recognizer.view.transform, translation.x, translation.y)];
        [recognizer setTranslation:CGPointZero inView:recognizer.view];
    }

}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return ![gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]];
}

1 个答案:

答案 0 :(得分:2)

如果你的图像比它的容器大,那么它应该可以工作:

- (void)panGestureDetected:(UIPanGestureRecognizer *)recognizer
{
    UIGestureRecognizerState state = [recognizer state];

    if (state == UIGestureRecognizerStateBegan || state == UIGestureRecognizerStateChanged)
    {
        CGPoint translation = [recognizer translationInView:recognizer.view];
        [recognizer.view setTransform:CGAffineTransformTranslate(recognizer.view.transform, translation.x, translation.y)];
        [recognizer setTranslation:CGPointZero inView:recognizer.view];
    }
    else if(state==UIGestureRecognizerStateEnded){
        UIView *imageView = recognizer.view;
        UIView *container = imageView.superview;

        CGFloat targetX = CGRectGetMinX(imageView.frame);
        CGFloat targetY = CGRectGetMinY(imageView.frame);


        if(targetX>0){
            targetX = 0;
        }else if(CGRectGetMaxX(imageView.frame)<CGRectGetWidth(container.bounds)){
            targetX = CGRectGetWidth(container.bounds)-CGRectGetWidth(imageView.frame);
        }

        if(targetY>0){
            targetY = 0;
        }else if(CGRectGetMaxY(imageView.frame)<CGRectGetHeight(container.bounds)){
            targetY = CGRectGetHeight(container.bounds)-CGRectGetHeight(imageView.frame);
        }

        [UIView animateWithDuration:0.3 animations:^{
            imageView.frame = CGRectMake(targetX, targetY, CGRectGetWidth(imageView.frame), CGRectGetHeight(imageView.frame));
        }];
    }
}