【问题标题】:In iOS how do I implement sliding a view within another view with momentum?在 iOS 中,我如何实现在另一个具有动量的视图中滑动视图?
【发布时间】:2014-06-17 10:02:54
【问题描述】:

我知道如何识别滑动手势,但我不知道如何使它所在的视图随动量向左或向右滑动。 '动量'我的意思是它会在手势结束后继续滑动一段时间,然后逐渐停止。我可以用平移手势移动视图,但视图很长,我需要比平移动作移动得更快更远。视图是否必须在UIScrollView 内?平移操作无需在 scrollView 中即可工作。

编辑:几个 cmets 问我想做什么。我正在开发一个应用程序,该应用程序通过低功耗蓝牙从传感器接收心率数据并以各种方式显示它。所以我在屏幕上有几个小的 UIView,每个都包含一个数据图。这些图仅使用 drawRect 和变换制作(让坐标标签正确定位是迄今为止最难的部分)。一个 UIView 具有每分钟节拍 (bpm) 与时间的关系,另一个具有 bpm 值的直方图,我可能会添加更多。 bpm 与时间图允许以每秒一个值的方式记录两个小时的数据,因此它的宽度为 7200 点。我可能会扩大它。随着每个新值的到达,它被放在右端。在绘图增长到填充 UIView 的整个宽度后,随着每个新值的添加,绘图开始向左移动一个点,因此最新数据始终可见。一些异常发生时会被标记出来,例如早搏和漏拍,这些标记会留在情节上并随之移动。之所以需要滑动和滚动,是因为我希望用户能够向后滑动数据以查看离开屏幕的值。我还需要能够上下平移(或滑动),以防在我尝试将垂直比例适合实际数据值之后值的范围不适合屏幕。所以这就是我想要完成的。我会回去尝试滚动视图。我想我没有让它工作,因为我无法弄清楚 swipeGesture 的去向以及如何使它导致滚动。

【问题讨论】:

  • 这似乎是滚动视图的理想情况。你有什么理由不想使用它吗?
  • 确实如此。让我们知道您似乎不喜欢 UIScrollView 的哪些方面,它完全符合您的要求,并且需要使用最少的代码,我们可以建议如何以不同的方式做事。重新实现操作系统已经完成的工作毫无意义。
  • 对于那些说使用滚动视图的人 - 例如,您如何拥有一个较大的背景图像 A,上面有一个较小的图像,然后相对于图像 B 滚动图像 A,而图像 B 保持静止.如果使用滚动视图,A 和 B 不会一起滚动吗?
  • @Sausages:我会将背景图像放在滚动视图后面(而不是滚动视图内部),并使滚动视图背景透明。
  • 我不一定需要避免滚动视图。我首先尝试了一个滚动视图,但没有让它工作,然后在一个普通的 UIView 中尝试了一个平移手势,它看起来很简单。根据此处的 cmets 和答案,我想我需要返回滚动视图并使其工作。请参阅我对原始问题的编辑,了解我想要完成的工作。

标签: ios ios7 uiview gesture


【解决方案1】:

这是我用于用户在另一个视图中向上/向下拖动视图的一些代码,该视图在视图上使用手势识别器,并且在用户抬起手指后有动力继续。

只需进行必要的更改以使其适应视图的开始/结束位置以及垂直或水平滚动等。

它没有使用滚动视图。动量是使用 UIViewAnimationOptionCurveEaseOut 实现的,您可以尝试使用其他动画曲线来查看您喜欢的动画曲线,但是正如您在帖子中描述的那样“在手势结束后继续滑动一段时间并逐渐停止。”

- (IBAction)handleVerticalSwipe:(id)sender
{
    if ([sender state] == UIGestureRecognizerStateBegan)
    {
        self.pulldownViewStartPosition = self.pulldownView.frame.origin.y;
    }
    else
    {
        int maxYPosition = 527; // Calculate at run time

        CGRect targetFrame = self.pulldownView.frame;
        CGFloat newYPos = 0;
        if ([sender state] == UIGestureRecognizerStateChanged)
        {
            // translationInView: returns a CGPoint which is not the position of the touch but the amount representing
            // the total translation over time.
            // The x and y values report the total translation over time. They are not delta values from the last time that
            // the translation was reported. Therefore the translation value should be applied to the state of the view when
            // the gesture is first recognized and should not be concatenated to the value each time the handler is called.

            CGPoint translation = [sender translationInView: [self.view superview]];

            newYPos = self.pulldownViewStartPosition + translation.y;

            if (newYPos > maxYPosition)
            {
                newYPos = maxYPosition;
            }
            if (newYPos < self.pullDownDefaultPosition)
            {
                newYPos = self.pullDownDefaultPosition;
            }

            targetFrame.origin.y = newYPos;
            self.pulldownView.frame = targetFrame;
        }
        else if ([sender state] == UIGestureRecognizerStateEnded) // User has lifted finger after swipe
        {
            // Gets the velocity of the gesture so it can be determined if the pulldown
            // should extend or retract
            CGFloat yVectorVelocity = [sender velocityInView: [self.view superview]].y;

            if (yVectorVelocity < 0)
            {
                newYPos = self.pullDownDefaultPosition;
            }
            else
            {
                newYPos = maxYPosition;
            }
            targetFrame.origin.y = newYPos;
            [UIView animateWithDuration:kPulldownDefaultAnimationDuration delay:0
                                options:UIViewAnimationOptionCurveEaseOut
                             animations:^{
                                 self.pulldownView.frame = targetFrame;
                             }
                             completion:nil];
        }
    }
}

【讨论】:

    【解决方案2】:

    是的,听起来 UIScrollView 正是您正在寻找的。我不确定您是否真的可以使用“动量”禁用滚动,但您会发现它的行为正是您需要的方式。

    您可能会发现 UIScrollView 无需在其中不必要地嵌套其他 UIView 即可完成您需要做的事情,而不是在 UIScrollView 中嵌套 UIView。我没有评论的声誉,但我想问一下你遇到的具体问题,或者你试图“滚动”呈现什么......?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-14
      相关资源
      最近更新 更多