0

我有一个以 NSTextView 作为单元格的 TableView。这是我在滚动视图中有滚动视图的情况。现在,当我滚动 textView 的内容时,当 textview 的内容到达末尾时,我希望父 scrollView ( tableView )继续滚动。但默认情况下不会发生这种情况。相反,当鼠标指针位于 textView 内时,父级根本不会滚动。

我想在这个例子中实现类似的东西。

这是我的解决方案:

public class DisableableScrollView: NSScrollView {

public override func scrollWheel(with event: NSEvent) {

    // Check if the text field is empty
    if (self.subviews[0].subviews[2] as! NSTextView).textStorage?.length == 0 {
        nextResponder?.scrollWheel(with: event)
    }
    // Bottom
    else if self.verticalScroller?.floatValue == 1.00  {
        if event.deltaY < 0 {
            nextResponder?.scrollWheel(with: event)
        }
        else {
            super.scrollWheel(with: event)
        }
    }
    // Top
    else if self.verticalScroller?.floatValue == 0.00  {
        if event.deltaY > 0 {
            nextResponder?.scrollWheel(with: event)
        }
        else {
            super.scrollWheel(with: event)
        }
    }

    else {
        super.scrollWheel(with: event)
    }
}

但是有一个问题:当我在一个文本字段上滚动时,另一个文本字段正在滚动。点击这里查看

问题出在魔术鼠标上。如果我使用普通的强大鼠标,一切正常。但是使用魔术鼠标,当我在滚动后抬起手指时,它会继续滚动(动量滚动)但有时会滚动错误的 textView 实例。根据Apple 文档,滚轮事件有两个属性:阶段和动量阶段。在我抬起手指后使用魔术鼠标,阶段变为结束,动量阶段变为开始。

有谁知道这个问题的标准解决方案?或者,如果我的代码是正确的,可能会出现什么问题?

4

2 回答 2

3

我找到了解决问题的方法,因此想到了分享它。

每当内容到达末尾时,此特定方法wantForwardedScrollEvents(for:)可用于将滚动事件向上转发到响应者链。我们只需要重写此方法并在必要时返回true 。

于 2018-12-18T09:03:31.093 回答
0

来自苹果指南

不要将滚动视图放在另一个滚动视图中。这样做会创建一个难以控制的不可预测的界面。

通常,一次显示一个滚动视图。人们在滚动时经常做出较大的滑动手势,并且很难避免与同一屏幕上的相邻滚动视图进行交互。如果您需要在一个屏幕上放置两个滚动视图,请考虑允许它们向不同方向滚动,这样一个手势就不太可能影响两个视图。例如,当 iPhone 处于纵向时,股票应用程序会显示在水平滚动的公司特定信息上方垂直滚动的股票报价。

你应该重新考虑你的设计。

于 2018-11-30T12:38:00.307 回答