【问题标题】:NSTextView inside NSScrollView not co-operating while scrollingNSScrollView中的NSTextView在滚动时不合作
【发布时间】:2019-05-02 13:04:17
【问题描述】:

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

I want to achieve something like in this example.

这是我的解决方案:

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)
    }
}

但是有一个问题:当我在一个文本字段上滚动时,另一个文本字段正在滚动。click here to see

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

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

【问题讨论】:

    标签: swift xcode cocoa nsscrollview magic-mouse


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      来自Apple Guidelines

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

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

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

      【讨论】:

      • 这是 macOS 版本:Scroll Views。它说“不要将滚动视图放在另一个滚动视图中。嵌套滚动条会创建一个难以控制的不可预测的界面。”。
      • 我在 Apple 自己的应用程序(如雷达)中看到了这种实现。但我不知道它是在代码中实现的。
      猜你喜欢
      • 1970-01-01
      • 2023-03-12
      • 2016-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多