CALayer.maskとCATextLayerの組み合わせでは、iOSでは無理かと思います(macOSなら可能かもしれません)。
maskプロパティで指定したレイヤーの「透明ではない部分が表示される」というような仕様(説明上簡略化しています)に従えば、「テキスト以外の部分が不透明、テキストの部分を透明」の画像を動的に生成してmaskに指定するしかないのかなと思います。
その方法で実現したサンプルが以下です。
swift
1class ViewController: UIViewController {
2
3 override func viewDidLoad() {
4 super.viewDidLoad()
5 // Do any additional setup after loading the view, typically from a nib.
6
7 view.backgroundColor = .white
8
9 // 宇宙画像のレイヤー生成
10 let targetLayer = CALayer()
11 targetLayer.contents = #imageLiteral(resourceName: "img").cgImage
12 targetLayer.backgroundColor = UIColor.black.cgColor
13 targetLayer.frame = CGRect(x: 50, y: 50, width: 300, height: 300)
14
15 // マスク画像の動的生成
16 UIGraphicsBeginImageContextWithOptions(CGSize(width: 300, height: 300), false, 0)
17 UIColor.black.setFill()
18 UIRectFill(CGRect(x: 0, y: 0, width: 300, height: 300))
19 UIGraphicsGetCurrentContext()?.setBlendMode(.clear) // ここでclearを指定すると文字の形で画像の一部分を消すことができる
20 NSString(string: "TEST").draw(at: CGPoint(x: 60, y: 100), withAttributes: [.font: UIFont.boldSystemFont(ofSize: 70)])
21 let maskImage = UIGraphicsGetImageFromCurrentImageContext()
22 UIGraphicsEndImageContext()
23
24 // マスクレイヤーを設定
25 let maskLayer = CALayer()
26 maskLayer.contents = maskImage?.cgImage
27 maskLayer.frame = CGRect(x: 0, y: 0, width: 300, height: 300)
28 targetLayer.mask = maskLayer
29
30 view.layer.addSublayer(targetLayer)
31 }
32}
ただ、ここまでするのでしたら、maskプロパティにこだわらずに、最初から宇宙飛行士の画像を動的に加工して文字の形で部分的に消した方が手っ取り早いかなとも思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/21 14:31