如何在Swift 4中仅使NSButton的一侧圆滑?

时间:2019-03-16 05:34:02

标签: swift macos cocoa nsbutton nssegmentedcontrol

一般来说,我是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编辑器上找到任何相关的属性/属性。也许我对解决这个看似简单的问题的方法过于复杂,或者也许我没有以正确的方式看待它,但是我希望有人可以帮助我解决这个问题。预先感谢!

1 个答案:

答案 0 :(得分:1)

1)您显示的图像正在使用简单的NSSegmentedControl。不需要定制。

2)您尝试执行的操作无论如何都行不通;如果它可以机械地工作,那么最终要做的就是将绘制的内容剪切到左上角。它不会神奇地填充右边的图形,并创建适当的控件边框等。

AppKit控件不仅仅是具有填充属性(如边框,背景等)的CALayers。它们几乎全部通过Core Graphics通过经典的drawRect:方法以一种或另一种方式绘制。视图具有图层的事实是由于图层支持。使用现有控件的层可以完成的工作很少。为了适当地自定义它们,您将适当地覆盖NSView,NSControl,NSCell等中的标准绘图例程。