【问题标题】:How to hide NSCollectionView Scroll indicator如何隐藏 NSCollectionView 滚动指示器
【发布时间】:2018-09-18 08:30:39
【问题描述】:

我有一个 NSCollectionView,我想隐藏水平滚动指示器。

我试过了

        collectionView.enclosingScrollView?.verticalScroller?.isHidden = true

但它不起作用。

提前谢谢你。

【问题讨论】:

  • 试试这行代码。 collectionView.enclosureScrollView?.horizo​​ntalScroller?.isHidden = true
  • 你明白了吗?我有同样的问题,但取消选中“显示 xyz Scroller”不会删除滚动指示器。我认为 NSCollectionViewFlowLayout 可能会再次添加指标。
  • 很遗憾没有。
  • @Jonathanff 嗨,你知道了吗?
  • 很遗憾没有:(

标签: swift macos nscollectionview


【解决方案1】:

隐藏对我也不起作用。

我发现破解此问题的唯一方法是更改​​插图:

scrollViewCollectionView 属于 NSScrollView 类型,此示例是在以编程方式创建 NSCollectionView 时)

scrollViewCollectionView.documentView?.enclosingScrollView?.scrollerInsets = NSEdgeInsets.init(top: 0, left: 0, bottom: 100, right: 0)

请注意:我的 NSCollectionView 是水平的,高度小于 100,这就是为什么这个 hack 在隐藏指示器中解决的原因。

【讨论】:

  • 这摆脱了滚动按钮,但不是滚动条的排水沟。
【解决方案2】:
  1. 为包含 CollectionView 的 ScrollView 创建一个出口,如 here 所示。我已经命名我的@IBOutlet weak var collectionViewScrollView: NSScrollView!
  2. viewDidAppear()函数中添加:

    collectionViewScrollView.scrollerStyle = .legacy collectionViewScrollView.verticalScroller?.isHidden = true - 垂直滚动 collectionViewScrollView.horizontalScroller?.isHidden = true - 用于水平滚动

出于某种原因,就我而言,它仅在我将collectionViewScrollView.scrollerStyle 设置为.legacy 时才有效。不知道为什么,但它确实有效。

【讨论】:

  • 它对我有用,它很容易关闭 NSCollectionView 的指标,但它从 NSScrollView 扩展,所以它关闭了它的指标。
【解决方案3】:

在情节提要中设置“显示垂直滚动条”或“显示水平滚动条”不会删除滚动条,除非设置集合视图的边界滚动视图的约束(高度和宽度)。在我这样做并取消选中情节提要的属性面板中的“显示垂直滚动条”和“显示水平滚动条”之后,它们就消失了。

【讨论】:

  • 我应该把约束放在哪里?集合视图的滚动视图已经有了前导、尾随、顶部、底部约束。
  • 在scrollView上做宽高
【解决方案4】:

我遇到了同样的问题,只是解决它。您可以编写自己的自定义 NSScrollView 并覆盖 2 个存储属性:hasHorizontalScrollerhorizontalScroller 和 1 个函数 scrollWheel(with:)。这是我的代码:

class MyScrollView: NSScrollView {
    override var hasHorizontalScroller: Bool {
        get {
            return false
        }
        set {
            super.hasHorizontalScroller = newValue
        }
    }

    override var horizontalScroller: NSScroller? {
        get {
            return nil
        }
        set {
            super.horizontalScroller = newValue
        }
    }
    //comment it or use super for scrroling
    override func scrollWheel(with event: NSEvent) {}
}

并且不要忘记在 .xib 或故事板中将 Border Scroll View 类设置为 MyScrollView。 尽情享受吧!

【讨论】:

    【解决方案5】:

    hasHorizontalScrollerhorizontalScroller 覆盖为falsenil 将导致NSScroller 不显示,NSScrollView 将不响应滚动事件。

    这意味着您无法滚动浏览NSScrollView 的许多滚动方法。

    hasHorizontalScroller = true时,horizontalScroller != nil会导致绘图错误。

     class MyScrollView : NSScrollView {
    
        // !!! Don't use this !!!
        override var hasHorizontalScroller: Bool {
            get {
                // return false will cause NSScroller not to be displayed
                // and NSScrollView will not respond to scroll events,
                // this means that you can't scroll through NSScrollView's many scrolling methods.
                false
            }
            set {
                super.hasHorizontalScroller = newValue
            }
        }
    
        // !!! Don't use this !!!
        override var horizontalScroller: NSScroller? {
            get {
                // return nil will cause NSScroller not to be displayed,
                // but it still occupies the drawing area of the parent view.
                nil
            }
            set {
                super.horizontalScroller = newValue
            }
        }
    }
    

    这是隐藏NSScroller 并正确响应滚动事件的方法。仅适用于 10.7 以上的版本:

    class HiddenScroller: NSScroller {
    
        // @available(macOS 10.7, *)
        // let NSScroller tell NSScrollView that its own width is 0, so that it will not really occupy the drawing area.
        override class func scrollerWidth(for controlSize: ControlSize, scrollerStyle: Style) -> CGFloat {
            0
        }
    }
    

    【讨论】:

      【解决方案6】:

      您也可以通过故事板实现这一目标

      【讨论】:

      • Xcode throws "'hidden' 已重命名为 'isHidden'"
      • 在情节提要上那些已经被取消选中并且滚动指示器仍然可见
      【解决方案7】:

      我也遇到了同样的问题。麦克马坦是对的。请将滚动条的位置调整到不可见的位置。

      scrollView.scrollerInsets = NSEdgeInsets.init(top: 0, left: 0, bottom: -10, right: 0)
      

      【讨论】:

        【解决方案8】:

        对于 UIKit 中的 Swift 4 和 5:

        对于水平:

        collectionView.showsHorizontalScrollIndicator = false
        

        对于垂直:

        collectionView.showsVerticalScrollIndicator = false
        

        【讨论】:

        • 这是 UIKit。问题是关于 AppKit
        • 谢谢,这正是我想要的!
        【解决方案9】:
        In my case, the horizontal and vertical scroller of the collection scroll view are only hidden if do exactly as follow:
        
        1. In Interface Builder.
        1.a. Select Scroll View —> Attributes Inspector:
            + Uncheck Show Horizontal Scroller.
            + Uncheck Show Vertical Scroller.
            + Uncheck Automactically Hide Scroller.
        1.b. Select Size Inspector:
            + Uncheck Automatically Adjust.
        1.c. Select Clip View —> Size Inspector:
            + Uncheck Automatically Adjust.
        2. In code do exactly as follow:
        
        [self.scrollView setBackgroundColor:[NSColor clearColor]];
        [self.scrollView setBorderType:NSNoBorder];
        [self.scrollView setHasVerticalScroller:NO];
        [self.scrollView setHasHorizontalScroller:NO];
        [self.scrollView setAutomaticallyAdjustsContentInsets:NO];
        [self.scrollView setContentInsets:NSEdgeInsetsMake(0.0, 0.0, -NSHeight([self.scrollView horizontalScroller].frame), -NSWidth([self.scrollView verticalScroller].frame))];
        [self.scrollView setScrollerInsets:NSEdgeInsetsMake(0.0, 0.0, -NSHeight([self.scrollView horizontalScroller].frame), -NSWidth([self.scrollView verticalScroller].frame))];
        [self.scrollView setScrollEnable:NO];
        
        NSClipView *clipView = (NSClipView *)[self.scrollView documentView];
        
        if ([clipView isKindOfClass:[NSClipView class]])
        {
            [clipView setAutomaticallyAdjustsContentInsets:NO];
            [clipView setContentInsets:NSEdgeInsetsZero];
        }
        
        Then the NSCollectionView will fit to the Clip View as same width and height without the horizontal and vertical scrollers.
        

        【讨论】:

          【解决方案10】:

          如果有人仍然需要它,这个技巧应该可以工作

          collectionView.enclosingScrollView?.horizontalScroller?.alphaValue = 0.0
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-06-30
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多