如何隐藏NSCollectionView滚动指示器

时间:2018-04-09 01:45:50

标签: swift macos nscollectionview

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

我已经尝试了

        collectionView.enclosingScrollView?.verticalScroller?.isHidden = true

但它没有用。

提前谢谢。

10 个答案:

答案 0 :(得分:4)

隐藏也不适合我。

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

scrollViewCollectionView 的类型为 NSScrollView ,此示例是在通过编程方式创建 NSCollectionView 时)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

wrong usage preview1

wrong usage preview2

这是隐藏 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
    }
}

答案 3 :(得分:0)

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

enter image description here

答案 4 :(得分:0)

我也遇到同样的问题。 MCMatan是正确的。请将滚动条的位置调整到不可见的位置。

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

答案 5 :(得分:0)

对于Swift 4和5:

对于水平:

{{"ack":"success"},"result":[{"ebayItemId":"153532419741"}]}

对于垂直:

collectionView.showsHorizontalScrollIndicator = false

答案 6 :(得分:0)

我遇到了同样的问题,只是解决了。您可以编写自己的自定义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
        }
    }

    override func scrollWheel(with event: NSEvent) {}
}

也不要忘记在.xib或情节提要中将Border Scroll View类设置为MyScrollView。 享受吧!

答案 7 :(得分:0)

  1. 为ScrollView创建一个插座,其中包含CollectionView,如here所示。我已将我的名字命名为@IBOutlet weak var collectionViewScrollView: NSScrollView!
  2. viewDidAppear()函数中
  3. 添加:

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

由于某些原因,仅在我将collectionViewScrollView.scrollerStyle设置为.legacy的情况下才有效。不知道为什么,但是可以。

答案 8 :(得分:0)

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.

答案 9 :(得分:0)

如果有人还需要它,这一招应该管用

collectionView.enclosingScrollView?.horizontalScroller?.alphaValue = 0.0