Вы можете сделать это, обрезав cgPaths вместо слоев фигур.
Вот пример игровой площадки:
import UIKit
import PlaygroundSupport
func getDesignElementPath(byElementID elementID : Int) -> CGPath
{
var pth: CGPath!
switch elementID
{
case 1:
let ovalPath = UIBezierPath(ovalIn: CGRect(x: 0, y: 0, width: 100, height: 100))
pth = ovalPath.cgPath
case 2:
let bezierPath = UIBezierPath()
bezierPath.move(to: (CGPoint(x: 50, y: 0)))
bezierPath.addLine(to: (CGPoint(x: 0, y: 100)))
bezierPath.addLine(to: (CGPoint(x: 100, y: 100)))
bezierPath.addLine(to: (CGPoint(x: 50, y: 0)))
bezierPath.close()
pth = bezierPath.cgPath
default:
print("")
}
return pth
}
class MyViewController : UIViewController
{
override func loadView() {
let view = UIView()
view.backgroundColor = .white
let img = renderTest()
let imageView = UIImageView(image: img)
imageView.frame.origin = CGPoint(x: 40, y: 40)
view.addSubview(imageView)
self.view = view
}
func renderTest() -> UIImage {
let size = CGSize(width: 100.0, height: 100.0)
UIGraphicsBeginImageContext(size)
guard let ctx = UIGraphicsGetCurrentContext() else { return UIImage() }
let circle = getDesignElementPath(byElementID: 1)
let triangle = getDesignElementPath(byElementID: 2)
ctx.addPath(circle)
ctx.clip()
ctx.addPath(triangle)
ctx.clip()
ctx.setFillColor(UIColor.yellow.cgColor)
ctx.fill(CGRect(x: 0, y: 0, width: size.width, height: size.height))
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image!
}
}
// Present the view controller in the Live View window
PlaygroundPage.current.liveView = MyViewController()
Результат:
![enter image description here](https://i.stack.imgur.com/OrKc6.png)
Редактировать:
Если вы хотите получить эту форму для обрезки изображения, вы можете использовать ее в качестве маски.
Тот же код, что и выше, но замените viewDidLoad()
на:
override func loadView() {
let view = UIView()
view.backgroundColor = .white
// load a 100x100 image (of a cat)
let imgForLayer = UIImage(named: "cat100x100.jpg")
// create a 100x100 UIView at x:40 y:40
let testView = UIView(frame: CGRect(x: 40.0, y: 40.0, width: 100.0, height: 100.0))
// create an "image layer"
let imgLayer = CALayer()
// set its frame to match the view
imgLayer.frame = testView.bounds
// set its contents to the "cat" image
imgLayer.contents = imgForLayer?.cgImage
// add it as an "image sub layer"
testView.layer.addSublayer(imgLayer)
// create image with triangle / oval clip path
let img = renderTest()
// create a UIImageView from the rendered image
let maskImageView = UIImageView(image: img)
// use that image view as a mask
testView.mask = maskImageView
// add testView to the view
view.addSubview(testView)
self.view = view
}
Изображение кошки:
![enter image description here](https://i.stack.imgur.com/VlBF9.jpg)
Результат:
![enter image description here](https://i.stack.imgur.com/Bm5Yk.png)