iOS:用于平滑滚动和轻弹视图的手势识别器
我正在构建一个iPad应用程序,我需要使用两个视图之间提供的分隔视图来调整视图的功能。分隔视图只是两个半屏内容视图之间的20px高度视图 - 请参阅附加图像。iOS:用于平滑滚动和轻弹视图的手势识别器
当用户向上或向下滚动此分隔视图时,两个内容视图都会相应地更改其大小。我已经扩展了UIView,并使用touchMoved代表实现了此代理,代码如下代码touchesMoved中给出的代码。它工作正常。 TouchMoved缺少的唯一东西是你无法直接将分隔视图轻弹到顶部或底部。你必须一直拖到顶部或底部!
为了支持弹出视图,我尝试了UIPanGestureRecognizer,但我没有看到顺利的拖动。设置父级的分割位置将调整两个内容视图,如代码中所示。当我在UIGestureRecognizerStateChanged状态下处理分割位置更改时,只需触摸分隔视图就可以将其滑动到顶部或底部。在UIGestureRecognizerStateEnded中处理分割位置变化的方法相同,但我没有看到使用dividerview滚动调整大小的内容视图!
有人可以告诉我如何实现平滑滚动的分隔视图与调整内容视图(如touchMoved)和轻弹视图?任何替代方法也可以。谢谢。
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {     UITouch *touch = [touches anyObject]; 
    if (touch) { 
     CGPoint lastPt = [touch previousLocationInView:self]; 
     CGPoint pt = [touch locationInView:self]; 
     float offset = pt.y - lastPt.y; 
     self.parentViewController.splitPosition = self.parentViewController.splitPosition + offset; 
    } 
} 
- (void)handlePan:(UIPanGestureRecognizer*)recognizer { 
    CGPoint translation = [recognizer translationInView:recognizer.view]; 
    CGPoint velocity = [recognizer velocityInView:recognizer.view]; 
    if (recognizer.state == UIGestureRecognizerStateBegan) { 
    } else if (recognizer.state == UIGestureRecognizerStateChanged) { 
     // If I change split position here, I don't see smooth scrolling dividerview...it directly jumps to the top or bottom! 
     self.parentViewController.splitPosition = self.parentViewController.splitPosition + translation.y; 
    } else if (recognizer.state == UIGestureRecognizerStateEnded) { 
     // If I change split position here, the same thing happens at end and I don't see my divider view moving with my scrolling and resizing my views. 
     self.parentViewController.splitPosition = self.parentViewController.splitPosition + translation.y; 
    } 
} 
初始屏幕
通过滚动底部分隔视图增加顶视图大小。
顶视图完全隐藏在这里,但我必须滚动分频器检视所有 顶部的方式。我想拂去分频器视图,以便它直接 从任何位置进入到顶部
回答:
如果我理解正确的话,你这里有两个独立的问题。
1st:使用GestureRecognizer时出现'不平滑'拖动。代码中的问题是,每次GR调用它的处理方法时,都会添加翻译。由于翻译是连续测量的,因此每次调用时都会添加一个更高的值(即第一个调用将在分割位置添加10,第二个20,第三个30等等)。
为了解决这个问题,你应该翻译设置为零您已经更新了分割位置后:
- (void)handlePan:(UIPanGestureRecognizer*)recognizer {     CGPoint translation = [recognizer translationInView:recognizer.view]; 
    if (recognizer.state == UIGestureRecognizerStateChanged) { 
     self.parentViewController.splitPosition = self.parentViewController.splitPosition + translation.y; 
    } 
    [recognizer setTranslation:CGPointZero inView:recognizer.view]; 
} 
第二:为了让用户轻弹分割位置更靠近顶部或底部,你可以检查UIGestureRecognizerStateEnded中的速度,并且如果它立即将分割位置设置为顶部或底部,则会立即执行某个值。
但使用UISwipeGestureRecognizer可能会更方便。
- (void)handleSwipe:(UISwipeGestureRecognizer *)gr { 
    if (gr.direction == UISwipeGestureRecognizerDirectionUp){ 
     [self.parentViewController moveSplitViewToTop]; 
    } 
    else if (gr.direction == UISwipeGestureRecognizerDirectionDown){ 
     [self.parentViewController moveSplitViewToBottom]; 
    } 
} 
在这种情况下,可能有必要(不知道,也许它不是)要求SwipeGR通过设置失败的PanGR触发前:
[panGestureRecognizer requireGestureRecognizerToFail:swipeGestureRecognizer]; 希望这有助于。
编辑: 关于你的评论,我假设频率你的意思是速度。如果你只使用PanGR,你可以修改上面的代码。像这样:
- (void)handlePan:(UIPanGestureRecognizer*)recognizer {     CGPoint translation = [recognizer translationInView:recognizer.view]; 
    CGPoint velocity = [recognizer velocityInView:recognizer.view]; 
    if (recognizer.state == UIGestureRecognizerStateChanged) { 
     self.parentViewController.splitPosition = self.parentViewController.splitPosition + translation.y; 
    } 
    else if (recognizer.state == UIGestureRecognizerStateEnded){ 
     if (velocity.y > someValue){ 
      [self.parentViewController moveSplitViewToBottom]; 
     } 
     else if (velocity.y < someValue){ 
      [self.parentViewController moveSplitViewToTop]; 
     } 
    } 
    [recognizer setTranslation:CGPointZero inView:recognizer.view]; 
} 
我不确定速度是否已签名,如果没有,您必须再次检查if-block中的翻译。
以上是 iOS:用于平滑滚动和轻弹视图的手势识别器 的全部内容, 来源链接: utcz.com/qa/265432.html





