这背后的基本思想是子类化 NSScroller,然后进行相应的更改。
我有相同的要求,所以我将其子类化并进行了如图所示的更改。 Objective C代码是在在线工具的帮助下转换的,所以对错误表示歉意 并看看。
这可能有帮助。
// Converted to Swift 4 by Swiftify v4.1.6766 - https://objectivec2swift.com/
// GridScroller.h
// Created by Vikram on 08/09/16.
import Cocoa
class OpaqGridScroller: NSScroller {
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
NSColor.clear.setFill()
dirtyRect.fill()
// whatever style you want here for knob if you want
knobStyle = .dark
}
}
您可以尝试覆盖绘制滚动条矩形
override func draw(_ dirtyRect: NSRect) {
NSDrawWindowBackground(bounds);
self.drawKnob()
}
您始终可以通过之前设置来绘制自定义矩形颜色
override func draw(_ dirtyRect: NSRect) {
NSColor.clear.set()
__NSRectFill(dirtyRect)
self.drawKnob()
}
这个解决方案对我有用。
class OpaqueGridScroller: NSScroller {
override func draw(_ dirtyRect: NSRect) {
// NSColor.clear.set()
// dirtyRect.fill()
self.drawKnob()
}
}
前述调用
self.drawKnob()
的答案仅部分正确。 问题是,如果没有任何东西可以朝该方向滚动,通常根本不应该绘制旋钮。
对于我的解决方案,我在滚动 NSTextView 中对垂直 NSScroller (滚动条)进行了子类化,以便覆盖滚动条的
draw()
方法,如上所述。 但是,当没有任何内容可滚动时,这会绘制一个长度不正确的旋钮。
所以我添加了
@IBOutlet var myScroller : NSScrollView!
作为子类 NSScroller 的属性并将其连接到 Storyboard 中,以便滚动条可以知道使用它的 NSScrollView,然后使用
绘制滚动条override draw(_ dirtyRect: NSRect)
{
if myScroller.contentSize.height < myScroller.documentView!.bounds.height {
self.drawKnob()
}
}
当 NSScrollView 的大小调整到足够大以至于没有任何垂直滚动的东西时,旋钮会消失,并且当有垂直滚动时会重新出现,同时允许其下方背景中的任何内容显示出来。
我不确定这是否是黑客攻击,或者是正确的解决方案,但它似乎按预期工作。
我知道这是一个老问题,但我只是找到了我认为更好的解决方案。 您可以只覆盖
drawKnobSlot
函数而不执行任何操作,如以下代码:
import Cocoa
final class CustomScroller: NSScroller {
override func drawKnobSlot(in slotRect: NSRect, highlight flag: Bool) {
}
}
苹果的文档对此方法的解释:
绘制滚动条轨道的一部分,可能包括位于给定矩形内的行增量和减量箭头按钮。