【问题标题】:Hide scrollers while leaving scrolling itself enabled in NSScrollView隐藏滚动条,同时在 NSScrollView 中启用滚动本身
【发布时间】:2012-02-20 16:49:20
【问题描述】:

我想隐藏NSScrollViewNSScrollers。我知道setHasHorizontalScroller:setHasVerticalScroller: 方法。但是,如果我禁用滚动条,沿该方向滚动也会被禁用。我只想隐藏滚动条,同时保持滚动的可能性。对此有什么想法吗?

【问题讨论】:

    标签: objective-c swift appkit nsscrollview


    【解决方案1】:

    我可以这样做:

    [labelsScrollView setHasHorizontalScroller:YES];
    [[labelsScrollView horizontalScroller] setAlphaValue:0];
    

    【讨论】:

    • 谢谢,这仍然适用于 Swift 的 macOS 10.13.4。我确实需要将.scrollerStyle 设置为.overlay 才能让它工作。出于某种原因,.legacy 滚动条的“背景”仍然被绘制。
    • 滚动条不可见,但仍然可以接收触摸:0
    【解决方案2】:

    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()
       }
    
       required init?(coder: NSCoder) {
          super.init(coder: coder)
          setupUI()
       }
    
       private func setupUI() {
          // Below assignments not really needed, but why not.
          scrollerStyle = .overlay
          alphaValue = 0
       }
    }
    

    用法:

    private class TabBarScrollView: NSScrollView {
    
       private func setupUI() {
    
          borderType = .noBorder
          backgroundColor = .clear
          drawsBackground = false
    
          horizontalScrollElasticity = .none
          verticalScrollElasticity = .none
    
          automaticallyAdjustsContentInsets = false
          horizontalScroller = InvisibleScroller()
       }
    }
    

    【讨论】:

      【解决方案3】:
      if collectionView.enclosingScrollView?.hasHorizontalScroller == true {
        collectionView.enclosingScrollView?.horizontalScroller?.scrollerStyle = .overlay
        collectionView.enclosingScrollView?.horizontalScroller?.alphaValue = 0.0
      } else {
        print("horizontalScroller")
      }
      

      确保选择了水平滚动条:

      【讨论】:

        【解决方案4】:

        我也在寻找这个问题的答案,因为设置 hasVerticalScroller = false 会为我禁用触控板滚动。与此同时,我可怕的 hack 是在我的 NSScrollView 子类中使用以下内容:

        self.hasVerticalScroller = true
        self.scrollerInsets.right = -999999
        

        滚动条在技术上是可见的,它只是远离视图的边缘。 :(

        【讨论】:

          【解决方案5】:

          您检查过NSScrollView Class Reference 吗?

          [scrollView setHasVerticalScroller:NO];
          

          此方法不会禁用滚动。

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

          [scrollView setHorizontalScroller:nil];
          

          【讨论】:

          • 我的英语(谢谢你,rokjarc。
          • 不起作用。设置这些操作中的任何一个都会导致滚动视图不再响应该方向的滚动事件。
          【解决方案6】:

          这是我上面山姆回答的解决方案:

          [myNSScrollView setHasVerticalScroller:YES];
          [_myNSScrollView setScrollerInsets:NSEdgeInsetsMake(0, 0, 0, -99999)];
          

          即使在滚动过程中,滚动条也会被隐藏。

          【讨论】:

            猜你喜欢
            • 2014-04-07
            • 1970-01-01
            • 2020-02-04
            • 2020-08-18
            • 1970-01-01
            • 2017-04-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多