一般来说,我是Swift和Stack Overflow的新手,所以我希望我不会要求太多。
我正在尝试实现一种可以在Finder或XCode编辑器工具栏like these two button groups中找到的“分组”按钮样式。如您在第一组按钮中所看到的,左侧按钮仅在左侧舍入,中央按钮完全不在舍入,而右侧按钮仅在右侧舍入。同样的情况适用于第二组按钮。我想完成这样的事情,但是我不确定如何实现。
在线搜索解决方案(包括iOS教程)后,我尝试提供NSButton类的扩展,并手动将两个左角四舍五入,如下所示:
// Extensions.swift
extension NSButton {
func roundLeftCorners() {
self.layer?.maskedCorners = [.layerMinXMinYCorner, .layerMinXMaxYCorner]
self.layer?.cornerRadius = 20.0 // Some arbitrary number, just wanted to make the rounded corner visible
self.layer?.masksToBounds = true
}
}
然后,在我的视图控制器的viewDidLoad()
函数上,我尝试调用此成员:
// MyViewController.swift
class MyViewController: NSViewController {
@IBOutlet weak var leftButton: NSButton!
override func viewDidLoad() {
super.viewDidLoad()
leftButton.roundLeftCorners()
}
// ...
}
...但这对我不起作用。一些简单的调试显示,Optional
的{{1}}值为self.layer
,所以我不确定那里发生了什么。
接下来,我尝试创建自己的自定义类,并使用上面的相同代码覆盖nil
函数,如下所示:
draw(_ dirtyRect:)
...但是这并没有除去右侧的圆角。奇怪的是,只有在数字// LeftButton.swift
class LeftButton: NSButton {
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
self.layer?.maskedCorners = [.layerMinXMinYCorner, .layerMinXMaxYCorner]
self.layer?.cornerRadius = 20.0
self.layer?.masksToBounds = true
}
}
// MyViewController.swift
class MyViewController: NSViewController {
@IBOulet weak var leftButton: LeftButton!
// ...
}
左右或更大时,新的cornerRadius
值才显而易见。更少,并且左角看起来与其他50.0
完全相同。
一些答案提到使用NSButton
手动在路径中绘制点,但是并没有达到我想要的。我也无法在Storyboard编辑器上找到任何相关的属性/属性。也许我对解决这个看似简单的问题的方法过于复杂,或者也许我没有以正确的方式看待它,但是我希望有人可以帮助我解决这个问题。预先感谢!
答案 0 :(得分:1)
1)您显示的图像正在使用简单的NSSegmentedControl。不需要定制。
2)您尝试执行的操作无论如何都行不通;如果它可以机械地工作,那么最终要做的就是将绘制的内容剪切到左上角。它不会神奇地填充右边的图形,并创建适当的控件边框等。
AppKit控件不仅仅是具有填充属性(如边框,背景等)的CALayers。它们几乎全部通过Core Graphics通过经典的drawRect:方法以一种或另一种方式绘制。视图具有图层的事实是由于图层支持。使用现有控件的层可以完成的工作很少。为了适当地自定义它们,您将适当地覆盖NSView,NSControl,NSCell等中的标准绘图例程。