使用 NSBezierPath 的 NSView 上的圆角绘制得很糟糕
rounded corners on NSView using NSBezierPath are drawn badly
在我的 ViewController 的主 NSView 中,我重写了 func drawRect(dirtyRect: NSRect)
方法以使用 NSBezierPath
在我的主视图上实现圆角。
在相同的方法中,我还指定了主视图的渐变背景。
override func drawRect(dirtyRect: NSRect) {
let path: NSBezierPath = NSBezierPath(roundedRect: self.bounds, xRadius: 18.0, yRadius: 18.0)
path.addClip()
let gradient = NSGradient(startingColor: NSColor(hexColorCode: "#383838"), endingColor: NSColor(hexColorCode: "#222222"))
gradient.drawInRect(self.frame, angle: 90)
}
出现的问题如下图所示:
图片显示了其中一个视角。圆角处理只取得了部分成功,因为仍然有一个白角伸出 window 的圆角之外。
如果有人有更好的方法来设置 window 的角半径,我会接受这样的建议。我对这个问题做了很多研究,但是这个解决方案似乎是最简单的。
非常感谢任何有关如何解决此问题的建议。
您应该在 NSWindow 实例上执行以下操作:
[window setOpaque:NO];
[window setBackgroundColor:[NSColor clearColor]];
并画出需要的形状。
并检查 this article。
我通过使用子层找到了解决方案。
class StyledButton: NSView {
let roundLayer: CALayer = CALayer()
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)!
setup()
}
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
func setup() {
self.wantsLayer = true
self.layer?.addSublayer(roundLayer)
roundLayer.frame = self.bounds
roundLayer.cornerRadius = 3
roundLayer.backgroundColor = NSColor.redColor().CGColor
}
}
在我的 ViewController 的主 NSView 中,我重写了 func drawRect(dirtyRect: NSRect)
方法以使用 NSBezierPath
在我的主视图上实现圆角。
在相同的方法中,我还指定了主视图的渐变背景。
override func drawRect(dirtyRect: NSRect) {
let path: NSBezierPath = NSBezierPath(roundedRect: self.bounds, xRadius: 18.0, yRadius: 18.0)
path.addClip()
let gradient = NSGradient(startingColor: NSColor(hexColorCode: "#383838"), endingColor: NSColor(hexColorCode: "#222222"))
gradient.drawInRect(self.frame, angle: 90)
}
出现的问题如下图所示:
图片显示了其中一个视角。圆角处理只取得了部分成功,因为仍然有一个白角伸出 window 的圆角之外。
如果有人有更好的方法来设置 window 的角半径,我会接受这样的建议。我对这个问题做了很多研究,但是这个解决方案似乎是最简单的。
非常感谢任何有关如何解决此问题的建议。
您应该在 NSWindow 实例上执行以下操作:
[window setOpaque:NO];
[window setBackgroundColor:[NSColor clearColor]];
并画出需要的形状。
并检查 this article。
我通过使用子层找到了解决方案。
class StyledButton: NSView {
let roundLayer: CALayer = CALayer()
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)!
setup()
}
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
func setup() {
self.wantsLayer = true
self.layer?.addSublayer(roundLayer)
roundLayer.frame = self.bounds
roundLayer.cornerRadius = 3
roundLayer.backgroundColor = NSColor.redColor().CGColor
}
}