我怎样才能在Swift 4中绕过NSButton的一侧?

问题描述 投票:0回答:1

我一般都是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()
    }

    // ...
}

......但那对我不起作用。一些简单的调试显示Optionalself.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完全相同。

一些答案提到用NSBezierPath手动绘制路径中的点,但它没有实现我想要的。我也在Storyboard编辑器上找不到任何相关的属性/属性。也许我已经过度复杂了我对这个看似简单的问题的处理方法,或者我可能没有以正确的方式看待它,但我希望有人可以帮助我解决这个问题。提前致谢!

swift macos cocoa nsbutton nssegmentedcontrol
1个回答
1
投票

1)您显示的图像使用简单的NSSegmentedControl。没有什么需要定制。

2)你试图做的事情无论如何都行不通;如果它可以机械地工作,它最终会做的只是在左角上剪切绘制的内容。它不会神奇地填充右侧的绘图,并创建适当的控制边框等。

AppKit控件不仅仅是填充了边框,背景等属性的CALayers。它们几乎全部是通过经典的drawRect:方法使用Core Graphics完全绘制的。视图具有层的事实是由于层支持。您最终可以使用现有控件的图层做很少的事情。要正确地自定义它们,您将根据需要覆盖NSView,NSControl,NSCell等中的标准绘图例程。

© www.soinside.com 2019 - 2024. All rights reserved.