【发布时间】:2012-02-20 16:49:20
【问题描述】:
我想隐藏NSScrollView 的NSScrollers。我知道setHasHorizontalScroller: 和setHasVerticalScroller: 方法。但是,如果我禁用滚动条,沿该方向滚动也会被禁用。我只想隐藏滚动条,同时保持滚动的可能性。对此有什么想法吗?
【问题讨论】:
标签: objective-c swift appkit nsscrollview
我想隐藏NSScrollView 的NSScrollers。我知道setHasHorizontalScroller: 和setHasVerticalScroller: 方法。但是,如果我禁用滚动条,沿该方向滚动也会被禁用。我只想隐藏滚动条,同时保持滚动的可能性。对此有什么想法吗?
【问题讨论】:
标签: objective-c swift appkit nsscrollview
我可以这样做:
[labelsScrollView setHasHorizontalScroller:YES];
[[labelsScrollView horizontalScroller] setAlphaValue:0];
【讨论】:
.scrollerStyle 设置为.overlay 才能让它工作。出于某种原因,.legacy 滚动条的“背景”仍然被绘制。
将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()
}
}
【讨论】:
我也在寻找这个问题的答案,因为设置 hasVerticalScroller = false 会为我禁用触控板滚动。与此同时,我可怕的 hack 是在我的 NSScrollView 子类中使用以下内容:
self.hasVerticalScroller = true
self.scrollerInsets.right = -999999
滚动条在技术上是可见的,它只是远离视图的边缘。 :(
【讨论】:
您检查过NSScrollView Class Reference 吗?
[scrollView setHasVerticalScroller:NO];
此方法不会禁用滚动。
如果您仍然不想使用该方法,您也可以:
[scrollView setHorizontalScroller:nil];
【讨论】:
这是我上面山姆回答的解决方案:
[myNSScrollView setHasVerticalScroller:YES];
[_myNSScrollView setScrollerInsets:NSEdgeInsetsMake(0, 0, 0, -99999)];
即使在滚动过程中,滚动条也会被隐藏。
【讨论】: