Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在iOS中,如何在另一个视图中使用动量滑动视图?_Ios_Ios7_Uiview_Gesture - Fatal编程技术网

在iOS中,如何在另一个视图中使用动量滑动视图?

在iOS中,如何在另一个视图中使用动量滑动视图?,ios,ios7,uiview,gesture,Ios,Ios7,Uiview,Gesture,我知道如何识别一个滑动手势,但我不知道如何使它使其上的视图以动量向左或向右滑动。我所说的“动量”是指在手势结束后,它会持续滑动一段时间,并逐渐停止。我可以用平移动作移动视图,但是视图很长,我需要比平移动作移动得更远更快。视图是否必须位于UIScrollView中?平移动作不在滚动视图中运行 编辑:一些评论问我想做什么。我正在开发一个应用程序,它通过蓝牙低能量从传感器接收心率数据,并以各种方式显示。所以我在屏幕上有几个小的UIView,每个都包含一个数据图。绘图仅使用drawRect和transf

我知道如何识别一个滑动手势,但我不知道如何使它使其上的视图以动量向左或向右滑动。我所说的“动量”是指在手势结束后,它会持续滑动一段时间,并逐渐停止。我可以用平移动作移动视图,但是视图很长,我需要比平移动作移动得更远更快。视图是否必须位于
UIScrollView
中?平移动作不在
滚动视图中运行


编辑:一些评论问我想做什么。我正在开发一个应用程序,它通过蓝牙低能量从传感器接收心率数据,并以各种方式显示。所以我在屏幕上有几个小的UIView,每个都包含一个数据图。绘图仅使用drawRect和transforms进行(到目前为止,将坐标标签正确定位是最困难的部分)。一个UIView有每分钟心跳(bpm)与时间的对比,另一个有bpm值的直方图,我可以添加更多。bpm vs.time(bpm vs.time)图允许以每秒一个值显示两小时的数据,因此宽7200点。我可以让它更宽一些。当每一个新值到达时,它都被放在右端。当绘图增长到填充UIView的整个宽度后,随着每个新值的添加,绘图开始向左移动一个点,因此最新数据始终可见。一些异常在发生时会被标记出来,例如早搏和漏搏,这些标记会留在图上并随图移动。之所以需要滑动和滚动,是因为我希望用户能够向后滑动数据以查看屏幕上显示的值。我还需要能够上下平移(或滑动),以防在我尝试将垂直刻度与实际数据值匹配后,值的范围不适合屏幕。这就是我想要实现的。我将继续尝试滚动视图。我想我没有让它工作,因为我不知道swipeGesture去了哪里,以及如何让它引起滚动。

是的,听起来UIScrollView正是你想要的。我不确定你是否真的可以用“动量”禁用滚动,但你会发现它的行为正是你所需要的


与将UIView嵌套在UIScrollView中不同,您可能会发现UIScrollView做了您需要它做的事情,而没有不必要地将其他UIView嵌套在UIScrollView中。我没有评论的名声,但我想问一下您正在经历的具体问题,或者您试图“滚动”呈现什么…?

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

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

它不使用滚动视图。动量是通过UIViewAnimationOptionCurveEaseOut实现的,你可以尝试其他动画曲线,看看你喜欢哪一条,但这条曲线就像你在帖子中描述的那样“在手势结束后保持滑动一段时间并逐渐停止”

-(iAction)handleVerticalSwipe:(id)发送方
{
如果([sender state]==UIgestureRecognitizerStateStart)
{
self.pulldownViewStartPosition=self.pulldownView.frame.origin.y;
}
其他的
{
int maxYPosition=527;//在运行时计算
CGRect targetFrame=self.pulldownView.frame;
cgloat-newYPos=0;
如果([sender state]==UIgestureRecognitizerStateChanged)
{
//TranslationView:返回一个CGPoint,该CGPoint不是触摸的位置,而是表示触摸的数量
//随时间推移的总翻译量。
//x和y值报告一段时间内的总平移。它们不是上次平移的增量值
//已报告转换。因此,转换值应应用于
//该手势首先被识别,不应在每次调用处理程序时连接到该值。
CGPoint translation=[sender translationView:[self.view superview]];
newYPos=self.pulldownViewStartPosition+translation.y;
if(newYPos>maxYPosition)
{
newYPos=最大位置;
}
if(newYPos
这似乎是滚动视图的理想情况。你有什么理由不想用它吗?是的。让我们知道您似乎不喜欢的
UIScrollView
,它正是您想要和需要的
- (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];
        }
    }
}