缩放不适用于 MacOS 中的 NSSlider

Posted

技术标签:

【中文标题】缩放不适用于 MacOS 中的 NSSlider【英文标题】:Scaling does not work for NSSlider in MacOS 【发布时间】:2018-08-06 10:04:25 【问题描述】:

我有一个 NSSlider,我正在尝试使用代码对其进行缩放:

let circle = NSSlider(frame: NSRect(x: 0.0, y: 333.0, width: 50.0, height: 50.0))
circle.layer?.setAffineTransform(CGAffineTransform(scaleX: 20.0, y: 20.0))
circle.wantsLayer = true
circle.sliderType = .circular

但这条线不起作用:

circle.layer?.setAffineTransform(CGAffineTransform(scaleX: 20.0, y: 20.0))

MacOS 中是否还有其他用于缩放的命令?我尝试像在 ios 中那样做,但它不起作用 我正在努力让它变大 2 倍

【问题讨论】:

circlewantsLayer = true 之前有一层吗? @Willeke 不,我在.circular 行之后添加addSubview 【参考方案1】:

如果不显着破解 NSSlider 类,这是不可能的。

NSSlider 实现以非键值可观察的方式不断将层的“仿射变换”重置为其原始单位矩阵 (scale=1)。滑块会暂时改变大小,然后恢复到原来的大小。

(您的代码中还有一个错误,因为您需要在访问图层之前设置 WantLayer=true。但这还不够。)

This question 有一个可接受的答案,解释了如何缩放任意 NSView。它适用于标签,但不适用于 NSSlider。

您可以做什么:您可以创建自己的滑块类,该类复制 NSSlider 的行为并具有缩放属性。或者:您可以对 NSSlider 进行逆向工程,以找出它阻止扩展它的尝试的原因。或者:也许您对调整滑块的knobThickness 感到满意?

【讨论】:

@J.Doe:你确定?请将circle.layer? 更改为circle.layer!。另外,做一些 NSLog 行。您是否在控制台中看到日志行并且应用程序没有崩溃?如果您没有看到日志行,则根本不会执行代码。如果它崩溃了,那就是层有问题。 不,它不会崩溃。我已经打印了layer,它打印时不会崩溃 @J.Doe:你说得对,它不起作用。似乎没有一个简单的方法来解决这个问题。请查看我的更新答案。【参考方案2】:

代码CGAffineTransform(scaleX: 20.0, y: 20.0) 会使滑块变大20 倍!您应该使用CGAffineTransform(scaleX: 2.0, y: 2.0) 使其扩大 2 倍

【讨论】:

我知道 :) 问题是它不会那样做,即使我做到了 x20!

以上是关于缩放不适用于 MacOS 中的 NSSlider的主要内容,如果未能解决你的问题,请参考以下文章

自定义缩放过渡不适用于模态演示

自动缩放到当前位置不适用于特定区域

Ujson 适用于 MacOS,但不适用于 Ubuntu

text 缩放窗口自动前进不适用于内置模板

Eclipse CDT 不适用于 macOS Monterey

TouchImageView 不适用于 ViewPager