约束更改后,UITableView点击第一次无法使用

尼克敏

重要提示:我的问题不是我正在实现didDeelectRowAt而不是在实现didSelectRowAt已经检查过:)

UITableView在模态呈现的视图控制器的部分屏幕上显示了一个。当用户拖动时,它会调整为全屏大小并返回到某些已定义的最小高度。我正在通过实现以下方法来做到这一点UIScrollViewDelegate

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    guard !scrollView.isDecelerating else { return }

    let contentOffset = scrollView.contentOffset.y
    if tableViewHeightConstraint.constant < view.frame.height && contentOffset > 0.0 {
        tableViewHeightConstraint.constant = min(contentOffset + tableViewHeightConstraint.constant, view.frame.height)
        scrollView.contentOffset.y = 0.0
        return
    }

    if tableViewHeightConstraint.constant > minViewHeight && contentOffset < 0.0 {
        tableViewHeightConstraint.constant = max(tableViewHeightConstraint.constant + contentOffset, minViewHeight)
        scrollView.contentOffset.y = 0.0
    }
}

func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
    // Here I have some calculations if depending the dragging end position and the velocity the end size should be full screen or `minViewHeight`
    // After calculating what the end size should be I'm animating the size change
    heightConstraint.constant = newConstraintHeight
    UIView.animate(withDuration: TimeInterval(calculatedAnimationDuration), delay: 0.0, options: .curveEaseOut, animations: {
        self.view.layoutIfNeeded()
    }, completion: nil)
}

有关调整大小和滚动的所有内容都可以正常工作,但是存在一个我无法弄清其原因的问题。如下:

  • 当第一次以最小高度显示带有表格视图的视图控制器时,我点击一个单元格就可以正常工作。
  • 如果我拖动以将表格视图扩展到全屏高度并点击一个单元格,则它再次可以正常工作。
  • 如果我拖动以将表格视图扩展到全屏高度,然后再次拖动以将其返回到最小高度,然后点击一个单元格,则什么也没有发生,没有UIScrollViewDelegate根本没有UITableViewDelegate调用任何方法。如果我再次点击一个单元,一切都会正常。

我注意到的一件事是,将表格视图拖回到最小高度后,滚动指示器不会隐藏。在第一个拍子上,它隐藏,在第二个拍子上,didSelectRowAt被调用。

更新:

这是针对该问题的测试存储库:https : //github.com/nikmin/DragTest

请不要介意拖动操作是否效果不佳,我只是放了一些东西,以便任何人都可以尝试,但是我认为这个问题很容易重现。

还有另外一件事...如果您从全尺寸一直拖动到底部,以使表格视图达到最小高度,然后继续拖动以使内容偏移小于0,然后释放,则不会发生此问题。

尼克敏

在试图找到解决方案而没有结果之后,我们(我和一个UX设计人员)决定稍微改变一下行为。

因此,在我要实现此功能的应用程序的实际场景中,表格视图位于另一个视图内,该视图也具有标题标签和表格视图上方的其他一些视图。我们决定向此根视图添加一个平移手势识别器,并在该视图具有最小大小时禁用表视图的滚动。这样,每当用户尝试将视图拖动到视图内的任何位置(包括表格视图)时,平移手势识别器都将接管,因此可以进行视图扩展。单元中的水龙头仍然有效。

当视图具有最大高度时,将启用表格视图滚动,以便用户可以滚动。这种方法的缺点是,当用户滚动到表格视图的顶部并继续滚动时,该视图不会减小大小。但是他仍然可以选择通过拖动表格视图上方的任何视图来将其向下拖动。当以这种方式向下拖动时,只有表格视图的大小发生变化,而内容偏移没有发生变化,这就是问题的根源(同时更改两者)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章