【问题标题】:Scaling view depending on x coordinate while being dragged拖动时根据 x 坐标缩放视图
【发布时间】:2014-12-03 22:35:43
【问题描述】:

我一直在尝试实现一个 UI 功能,我在一些使用卡片显示信息的应用程序中看到了这种功能。我当前的视图控制器如下所示:

并且用户可以沿 x 轴左右拖动卡片。拖动到屏幕的右侧对卡片的比例没有任何影响(只是改变位置)但是如果用户向左滑动它我想根据它的 y 坐标慢慢减小它的比例(例如比例是最小的当卡片向左最远时,从该点开始变大,直到达到原始大小)。如果卡片被拖到左边足够远,它会淡出,但如果用户没有将它拖得足够远,它的比例会增加并移回中间。到目前为止我尝试过的代码:

- (void)handlePanImage:(UIPanGestureRecognizer *)sender
{
    static CGPoint originalCenter;

    if (sender.state == UIGestureRecognizerStateBegan)
    {
        originalCenter = sender.view.center;
        sender.view.alpha = 0.8;
        [sender.view.superview bringSubviewToFront:sender.view];
    }
    else if (sender.state == UIGestureRecognizerStateChanged)
    {
        CGPoint translation = [sender translationInView:self.view];
        NSLog(@"%f x %f y",translation.x ,translation.y);
        sender.view.center=CGPointMake(originalCenter.x + translation.x, yOfView);
        CGAffineTransform transform = sender.view.transform;
        i-=0.001;
        transform = CGAffineTransformScale(transform, i, i);
        //transform = CGAffineTransformRotate(transform, self.rotationAngle);
        sender.view.transform = transform;
    }
    else if (sender.state == UIGestureRecognizerStateEnded || sender.state == UIGestureRecognizerStateCancelled || sender.state == UIGestureRecognizerStateFailed)
    {
        if(sender.view.center.x>0){
            [UIView animateWithDuration:0.2 animations:^{
                CGRect rect=[sender.view frame];
                rect.origin.x=([self.view frame].size.width/2)-_protoypeView.frame.size.width/2;
                rect.size.height=originalHeight;
                rect.size.width=originalWidth;
                [sender.view setFrame:rect];
                i=1.0;

            }];
        }
        [UIView animateWithDuration:0.1 animations:^{
            sender.view.alpha  = 1.0;
        }];
    }
}

这看起来非常有问题并且不能正常工作。我也尝试根据翻译改变比例:

else if (sender.state == UIGestureRecognizerStateChanged)
    {
        CGPoint translation = [sender translationInView:self.view];
        NSLog(@"%f x %f y",translation.x ,translation.y);
        sender.view.center=CGPointMake(originalCenter.x + translation.x, yOfView);
        CGAffineTransform transform = sender.view.transform;
        transform = CGAffineTransformScale(transform, translation.x/100, translation.x/100);
        //transform = CGAffineTransformRotate(transform, self.rotationAngle);
        sender.view.transform = transform;
    }

但比例尺要么太大要么太小。任何帮助将不胜感激:)

【问题讨论】:

    标签: objective-c xcode uipangesturerecognizer


    【解决方案1】:

    在您尝试的最后一段代码中,您做错了几件事。缩放变换将是累积的,因为您从未将平移手势识别器的平移设置回 0。此外,如果您查看变换中的数学运算,您会发现 -1 点的小移动会缩放视图到原来大小的 0.01 倍。你显然不想那样。您需要将那个小的负数加到 1,这样初始的 -1 点移动将缩放到 0.99。将平移器的平移设置回零的更改需要更改中心计算以使用 sender.view.center.x 而不是 originalCenter.X。您还需要一个 if 语句来检查中心是在其起始位置的左侧还是右侧,以便您知道是否应该应用缩放变换。像这样的,

    -(void)handlePan:(UIPanGestureRecognizer *) sender {
        if (sender.state == UIGestureRecognizerStateBegan) {
            originalCenter = sender.view.center;
            sender.view.alpha = 0.8;
            [sender.view.superview bringSubviewToFront:sender.view];
    
        }else if (sender.state == UIGestureRecognizerStateChanged){
            CGPoint translation = [sender translationInView:self.view];
            sender.view.center=CGPointMake(sender.view.center.x + translation.x, sender.view.center.y);
            if (sender.view.center.x < originalCenter.x) {
                CGAffineTransform transform = sender.view.transform;
                transform = CGAffineTransformScale(transform, 1+translation.x/100.0, 1+translation.x/100.0);
                sender.view.transform = transform;
            }
            [sender setTranslation:CGPointZero inView:self.view];
        }
    }
    

    这不负责将视图动画化或淡出视图,但它应该可以让您大部分时间到达那里。

    【讨论】:

    • 这对于视图的比例部分非常有效,但我似乎无法让它恢复到原来的大小。将比例转换为 1,1 没有效果并且 CGRect rect2=[sender.view frame]; rect2.size.height=原始高度; rect2.size.width=原始宽度; [sender.view setFrame:rect2];在 sender.state == UIGestureRecognizerStateEnded 中调用时使视图整体消失。
    猜你喜欢
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    相关资源
    最近更新 更多