滑动时触摸栏中的触发按钮

时间:2017-08-01 16:34:39

标签: nsbutton nstouchbar

我创建了一个带有许多彩色按钮的Touch Bar。 用户通常会使用按钮更改颜色。 当按下按钮时,当前窗口的一些图形元素随着按钮的颜色而相应地改变。 我希望在按钮之间滑动元素会改变它们的颜色,而不必等待内部触摸"事件

有快速的方法吗?

编辑:我认为这样做的方法是使用momentaryPushIn类型的按钮,或者创建一个子类化按钮的类,并在内部触摸"触摸"事件

我更喜欢第一种方法,但我发现文档很差。

1 个答案:

答案 0 :(得分:1)

由于您在此批准了Scrubber解决方案,因此它是:

首先,您需要创建 NSScrubber 的实例并将其插入触摸栏。确保选择模式已修复。

yourScrubber.mode = .fixed

然后为了突出显示(只是为了看轮廓是眼睛,没有这个轮廓显示一切都能正常工作)将选择叠加样式设置为.outlineOverlay。

youtScrubber.mode = .selectionBackgroundStyle = .outlineOverlay

接下来为数据源和选择事件设置委托。

yourScrubber.delegate = self
yourScrubber.dataSource = self

然后返回洗涤器中的物品数量

public func numberOfItems(for scrubber: NSScrubber) -> Int {
    return 8 
}

现在您需要插入项目( NSScrubberItemView )。其中也可以填充 NSScrubberImageItemView NSScrubberTextItemView ,甚至是自定义的NSView。

如何填充洗涤器的内容有很多种方法,为了方便您提供图像的情况,它将如下所示:

public func scrubber(_ scrubber: NSScrubber, viewForItemAt index: Int) -> NSScrubberItemView {
    let itemView = scrubber.makeItem(withIdentifier: "colorIdentifier", owner: nil) as! NSScrubberImageItemView
    itemView.image = yourImage
    return itemView
}

现在你应该可以看到这样的东西:(我用随机图像作为我的洗涤器)

enter image description here

此外,您应该能够看到(如果您启用了大纲)选择项目: enter image description here

好的,现在最重要的部分,如何获得你想要的效果:(使用委托协议方法)

public func scrubber(_ scrubber: NSScrubber, didHighlightItemAt highlightedIndex: Int) {
    print("highlight = \(highlightedIndex)")
    //your code here
}

结果是这样的:(通知输出窗口) enter image description here

您还可以在定义单元格宽度的单元格之间添加间距:

func scrubber(_ scrubber: NSScrubber, layout: NSScrubberFlowLayout, sizeForItemAt itemIndex: Int) -> NSSize {
    return NSSize(width: yourWidth, height: 30)
}

也许您会找到用于:

optional public func scrubber(_ scrubber: NSScrubber, didSelectItemAt selectedIndex: Int)