Я новичок в Swift и Stack Overflow в целом, поэтому я надеюсь, что не прошу многого о себе.
Я пытаюсь создать «сгруппированный» стиль кнопки, который можно найти в Finder или на панели инструментов редактора XCode, как эти две группы кнопок. Как вы можете видеть в первой группе кнопок, левая кнопка закруглена только с левой стороны, центральная кнопка вообще не закруглена, а правая кнопка закруглена только с правой стороны. То же самое относится и ко второй группе кнопок. Я хочу сделать что-то подобное, но я не уверен, как это сделать.
После поиска решения в Интернете (включая учебные пособия по 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
для 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
.
В некоторых ответах упоминалось ручное рисование точек на пути с помощью NSBezierPath
, но это не дает того, чего я хочу. Я также не могу найти какие-либо связанные свойства/атрибуты в редакторе раскадровки. Возможно, я слишком усложнил свой подход к этой, казалось бы, простой проблеме, или, может быть, я смотрю на нее не так, но я надеюсь, что кто-то сможет мне помочь с этим. Заранее спасибо!