隐藏滚动条,同时在NSScrollView中启用滚动功能

mpl*_*ert 9 objective-c appkit nsscrollview swift

我想隐藏的NSScrollerNSScrollView.我知道这些方法setHasHorizontalScroller:setHasVerticalScroller:.但是,如果我禁用滚动条,那么在该方向上滚动也会被禁用.我只想隐藏滚动条,同时保持滚动的可能性.有什么想法吗?

Mar*_*Bao 11

通过这样做,我能够做到这一点:

[labelsScrollView setHasHorizontalScroller:YES];
[[labelsScrollView horizontalScroller] setAlphaValue:0];
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这仍然可以在带有Swift的macOS 10.13.4上运行。我确实需要将`.scrollerStyle`设置为`.overlay`才能起作用。由于某些原因,使用.legacy仍会绘制滚动条的“背景”。 (2认同)

Vla*_*lad 8

设置的伎俩alphaValue,以zero有问题,因为看不见的滚轮仍接收触摸。这是我们为解决此问题所做的工作(Swift 4)。

class InvisibleScroller: NSScroller {

   override class var isCompatibleWithOverlayScrollers: Bool {
      return true
   }

   override class func scrollerWidth(for controlSize: NSControl.ControlSize, scrollerStyle: NSScroller.Style) -> CGFloat {
      return CGFloat.leastNormalMagnitude // Dimension of scroller is equal to `FLT_MIN`
   }

   public override init(frame frameRect: NSRect) {
      super.init(frame: frameRect)
      setupUI()
   }

   private func setupUI() {
      // Below assignments not really needed, but why not.
      scrollerStyle = .overlay
      alphaValue = 0
   }
}
Run Code Online (Sandbox Code Playgroud)

用法:

private class TabBarScrollView: NSScrollView {

   private func setupUI() {

      borderType = .noBorder
      backgroundColor = .clear
      drawsBackground = false

      horizontalScrollElasticity = .none
      verticalScrollElasticity = .none

      automaticallyAdjustsContentInsets = false
      horizontalScroller = InvisibleScroller()
   }
}
Run Code Online (Sandbox Code Playgroud)


0xD*_*15B 0

您检查过NSScrollView 类参考吗?

[scrollView setHasVerticalScroller:NO];
Run Code Online (Sandbox Code Playgroud)

此方法不会禁用滚动。

如果您仍然不想使用该方法,您还可以:

[scrollView setHorizontalScroller:nil];
Run Code Online (Sandbox Code Playgroud)

  • 不起作用。设置这些操作中的任何一个都会导致滚动视图不再响应该方向的滚动事件。 (3认同)