【问题标题】:Is it possible to make a circular NSButton?是否可以制作圆形 NSButton?
【发布时间】:2016-03-03 19:25:10
【问题描述】:

我正在尝试创建自定义形状NSButton。特别是我正在尝试使用自定义图像制作一个圆形按钮。我在创建自定义UIButton 时找到了a tutorial,并尝试将其调整为NSButton。但是有一个很大的问题。 clipsToBounds 似乎只有 iOS(

这是我的代码:

import Cocoa

class ViewController: NSViewController {

    @IBOutlet weak var mainButton: NSButton!
    var size = 32

    override func viewDidLoad() {
        super.viewDidLoad()
        configureButton()
                // Do any additional setup after loading the view.
    }
    func configureButton()
    {
        mainButton.wantsLayer = true
        mainButton.layerContentsRedrawPolicy = NSViewLayerContentsRedrawPolicy.OnSetNeedsDisplay
        mainButton.layer?.cornerRadius = 0.5 * mainButton.bounds.size.width
        mainButton.layer?.borderColor = NSColor(red:0.0/255.0, green:122.0/255.0, blue:255.0/255.0, alpha:1).CGColor as CGColorRef
        mainButton.layer?.borderWidth = 2.0
    }

    override var representedObject: AnyObject? {
        didSet {
        // Update the view, if already loaded.
        }
    }


}

我做错了什么?如何制作圆形 NSButton?你能建议什么替换clipsToBounds吗?

因为这是我目前所能得到的:

【问题讨论】:

  • "clipsToBounds 似乎仅限 iOS" 但 CALayer masksToBounds 不是。区别仅仅是因为 NSView 不会自动支持图层,而 UIView 是。

标签: swift macos nsbutton


【解决方案1】:

NSButton 是 NSView 的子类,因此 NSView 中的所有方法,例如 drawRect(_:),在 NSButton 中也是可用的。

所以创建一个新的 Button.swift 来绘制你的自定义布局

import Cocoa

class Button: NSButton {

    override func drawRect(dirtyRect: NSRect) {
        super.drawRect(dirtyRect)

        // Drawing code here.
        let path = NSBezierPath(ovalIn: dirtyRect)
        NSColor.green.setFill()
        path.fill()
    }

}

很棒的教程Here。它是 iOS ,但非常相似!

【讨论】:

  • 代码绘制了圆圈,但矩形的剩余部分仍然存在。这是因为调用了super。
【解决方案2】:

不要玩转角半径。圆没有角。要使按钮显示为圆形,请将按钮的 layer 隐藏为圆形。

【讨论】:

  • 即使你在 OS X 上,原理和这个 iOS 答案没有什么不同:stackoverflow.com/a/16475824/341994 毕竟,Core Graphics 就是 Core Graphics,而 CALayer 就是 CALayer,不管你是哪个平台的继续。
  • 当然,遮罩会破坏对焦环和可访问性。
  • @ClausJørgensen 非常有趣的一点。我没想到。
【解决方案3】:

您正在根据按钮的宽度设置半径。从您的屏幕截图来看,当您开始时,按钮不是正方形,因此圆角无法创建圆形。

【讨论】:

    猜你喜欢
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    相关资源
    最近更新 更多