缩放不适用于 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 倍
【问题讨论】:
circle
在wantsLayer = 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的主要内容,如果未能解决你的问题,请参考以下文章