【问题标题】:UIPanGestureRecognizer and UIPinchGestureRecogizer for zoom in AND move with bounce-pull back animationUIPanGestureRecognizer 和 UIPinchGestureRecogizer 用于放大和移动反弹-拉回动画
【发布时间】:2014-06-25 11:57:59
【问题描述】:

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

意思是,如果用户将 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]];
}

【问题讨论】:

    标签: ios objective-c uiimageview uipangesturerecognizer


    【解决方案1】:

    如果您的图像大于其容器,则应该可以使用:

    - (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));
            }];
        }
    }
    

    【讨论】:

    • 感谢您的帮助。我测试你的代码。放大后,我移动了 uiimageview,但现在不能移动太多,也不能移动到边框。它只停留在中心区域。您的代码在放大后考虑 uiimageview 的新大小?
    • 显然不是 ;) 所以尝试将 viewSize.widthviewSize.height 与您当前的 scaleFactor 相乘
    • 不是最好的,但一个简单的解决方案是在每次更改时将比例存储在变量中。如何将比例分配给 UIImageView?
    • 我更新了我的问题。请检查。这是我的错误。当 UIImageView 小于 superview 时,您的代码很好。但是,我的意思是别的。 UIImageView 比 superview 大。当用户结束移动/平移手势时,会有动画拉回图像以覆盖空白空间(因为 uiimageview 比 superview 更大)。 facebook 应用程序 (ipad) 和其他应用程序具有此回拉动画。对不起,我错了。如果您仍然可以提供帮助,请参阅我更新的问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    相关资源
    最近更新 更多