我最近一直在做类似的事情,但我使用的是 NSBezierPath 而不是 UIBezierPath ......虽然它们应该是等价的。我想用位图图像填充六边形的内部。我正在用六边形瓷砖写一个电脑棋盘游戏。
我创建了一个六边形路径,如下所示:
let path = NSBezierPath()
let rads = CGFloat(Double.pi) / 180.0
var p = NSPoint(x: scale*cos(30 * rads) + x, y: scale*sin(30 * rads) + y)
path.move(to: p)
p = NSPoint(x: scale*cos(90 * rads) + x, y: scale*sin(90 * rads) + y)
path.line(to: p)
p = NSPoint(x: scale*cos(150 * rads) + x, y: scale*sin(150 * rads) + y)
path.line(to: p)
p = NSPoint(x: scale*cos(210 * rads) + x, y: scale*sin(210 * rads) + y)
path.line(to: p)
p = NSPoint(x: scale*cos(270 * rads) + x, y: scale*sin(270 * rads) + y)
path.line(to: p)
p = NSPoint(x: scale*cos(330 * rads) + x, y: scale*sin(330 * rads) + y)
path.line(to: p)
p = NSPoint(x: scale*cos(30 * rads) + x, y: scale*sin(30 * rads) + y)
path.line(to: p)
path.lineWidth = 3.5
...然后我简单地添加了:
path.setClip()
let mainBundle: Bundle = Bundle.main
imagePath = mainBundle.pathForImageResource("Swatch1.png")!
let gSwatch1 = NSImage(contentsOfFile:imagePath)!
gSwatch1.draw(in: path.bounds)
...这会在六边形路径的范围内绘制图像“Swatch1.png”。
您可以通过更改目标的边界 Rect 来缩放图像,但您也可以使用 NSAffineTransform 等应用任何其他转换。