滑动时触发 Touch Bar 中的按钮
Trigger buttons in Touch Bar when sliding
我创建了一个带有许多彩色按钮的 Touch Bar。
用户通常会使用按钮更改颜色。
当按下按钮时,当前 window 的一些图形元素会随着按钮的颜色而相应变化。
我希望在按钮之间滑动手指,元素会改变它们的颜色,而不必等待 "touch up inside" 事件。
有什么快速的方法吗?
编辑:我认为这样做的一种方法是使用 momentaryPushIn 类型的按钮或创建一个 class subclass 按钮并传递类似 "touch inside" 事件。
我更喜欢第一种方法,但我发现一个非常糟糕的文档。
由于您在此处批准了 Scrubber 解决方案,因此它是:
首先您需要创建 NSScrubber 实例并将其插入您的触控栏。确保 selection 模式将被固定。
yourScrubber.mode = .fixed
然后为了突出显示(只是为了看轮廓是眼睛,没有这个轮廓显示一切都会正常工作)将选择叠加样式设置为.outlineOverlay。
youtScrubber.mode = .selectionBackgroundStyle = .outlineOverlay
接下来为数据源和 selection 事件设置委托。
yourScrubber.delegate = self
yourScrubber.dataSource = self
然后return 洗涤器中的项目数量
public func numberOfItems(for scrubber: NSScrubber) -> Int {
return 8
}
现在您需要插入项目(NSScrubberItemView)。也可以用 NSScrubberImageItemView 或 NSScrubberTextItemView 甚至您的自定义 NSView 填充。
有很多方法可以填充 scrubber 的内容,对于您提供图像的简单情况,它看起来像这样:
public func scrubber(_ scrubber: NSScrubber, viewForItemAt index: Int) -> NSScrubberItemView {
let itemView = scrubber.makeItem(withIdentifier: "colorIdentifier", owner: nil) as! NSScrubberImageItemView
itemView.image = yourImage
return itemView
}
现在您应该能够看到类似这样的内容:(我为我的洗涤器使用了随机图像)
您还应该能够看到(如果您启用了大纲)select 项目:
好的,现在是最重要的部分,如何得到你想要的效果:(使用委托协议方法)
public func scrubber(_ scrubber: NSScrubber, didHighlightItemAt highlightedIndex: Int) {
print("highlight = \(highlightedIndex)")
//your code here
}
结果如下:(注意输出 window)
您还可以在定义单元格宽度的单元格之间添加间距:
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)
我创建了一个带有许多彩色按钮的 Touch Bar。 用户通常会使用按钮更改颜色。 当按下按钮时,当前 window 的一些图形元素会随着按钮的颜色而相应变化。 我希望在按钮之间滑动手指,元素会改变它们的颜色,而不必等待 "touch up inside" 事件。
有什么快速的方法吗?
编辑:我认为这样做的一种方法是使用 momentaryPushIn 类型的按钮或创建一个 class subclass 按钮并传递类似 "touch inside" 事件。
我更喜欢第一种方法,但我发现一个非常糟糕的文档。
由于您在此处批准了 Scrubber 解决方案,因此它是:
首先您需要创建 NSScrubber 实例并将其插入您的触控栏。确保 selection 模式将被固定。
yourScrubber.mode = .fixed
然后为了突出显示(只是为了看轮廓是眼睛,没有这个轮廓显示一切都会正常工作)将选择叠加样式设置为.outlineOverlay。
youtScrubber.mode = .selectionBackgroundStyle = .outlineOverlay
接下来为数据源和 selection 事件设置委托。
yourScrubber.delegate = self
yourScrubber.dataSource = self
然后return 洗涤器中的项目数量
public func numberOfItems(for scrubber: NSScrubber) -> Int {
return 8
}
现在您需要插入项目(NSScrubberItemView)。也可以用 NSScrubberImageItemView 或 NSScrubberTextItemView 甚至您的自定义 NSView 填充。
有很多方法可以填充 scrubber 的内容,对于您提供图像的简单情况,它看起来像这样:
public func scrubber(_ scrubber: NSScrubber, viewForItemAt index: Int) -> NSScrubberItemView {
let itemView = scrubber.makeItem(withIdentifier: "colorIdentifier", owner: nil) as! NSScrubberImageItemView
itemView.image = yourImage
return itemView
}
现在您应该能够看到类似这样的内容:(我为我的洗涤器使用了随机图像)
您还应该能够看到(如果您启用了大纲)select 项目:
好的,现在是最重要的部分,如何得到你想要的效果:(使用委托协议方法)
public func scrubber(_ scrubber: NSScrubber, didHighlightItemAt highlightedIndex: Int) {
print("highlight = \(highlightedIndex)")
//your code here
}
结果如下:(注意输出 window)
您还可以在定义单元格宽度的单元格之间添加间距:
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)