选择行时阻止TableView滚动

时间:2018-04-10 03:04:23

标签: ios swift uitableview

我想阻止我的表格视图滚动到所选单元格。

由于某种原因,当我选择一个单元格并且键盘出现时,我的单元格向上移动了一点,我不希望出现这种情况。

我正在使用表格视图控制器并将isScrollEnabled设置为false

我已经覆盖了didSelectRowAt,绝对不做任何事情。

在故事板中,我已禁用滚动,禁用分页,禁用滚动/缩放时弹跳,水平/垂直禁用弹跳。

然而它仍然滚动到选定的单元格。

4 个答案:

答案 0 :(得分:0)

我建议您使用带有tableview的UIViewController。 您描述的行为实际上是由UITableViewController自动处理的内容。

编辑:

以下是UIViewController的屏幕截图,其中包含带静态单元格的tableview:

enter image description here

答案 1 :(得分:0)

只需使用这行代码就可以避免滚动tableview ....

tableView.isScrollEnabled = false

此行将禁用tableview的滚动功能,只要您希望它再次滚动,请将此属性设置为true。

答案 2 :(得分:0)

好吧,在我作为iOS开发人员的整个职业生涯中,这可能是第一个将UITableView IS 继承为最佳答案的案例!

UITableView使用平移手势识别器来检测滚动手势。 tableview本身必须是它的委托,因为我们可以通过继承UITableView来阻止手势被检测到:

import UIKit

class DontScrollTableView: UITableView, UIGestureRecognizerDelegate {

    var dontScroll = false

    override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        return !dontScroll
    }
}

在我们的UITableViewDelegate实现中,我们可以切换滚动:

var previouslySelectedIndexPath: IndexPath?

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if let tv = tableView as? DontScrollTableView {
        if let lastSelected = previouslySelectedIndexPath {
            tv.dontScroll = lastSelected != indexPath
            if lastSelected == indexPath {
                tableView.deselectRow(at: indexPath, animated: false)
                previouslySelectedIndexPath = nil
            } else {
                previouslySelectedIndexPath = indexPath
            }
        } else {
            tv.dontScroll = true
            previouslySelectedIndexPath = indexPath
        }
    }

}

func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
    if let tv = tableView as? DontScrollTableView {
        tv.dontScroll = false
    }
}

答案 3 :(得分:-2)

解决方案是覆盖viewwillappear而不是调用super方法。