私はSwiftを使用してxCodeでアプリを開発しています。私の画面には動物の画像(アウトレット "backImage")があり、この画像の上にビュー(アウトレット "coverView")があり、色は黒で、すべての画面を覆っています。これまでのところ、「coverView」がその前にあるため、動物の画像を見ることができません。次に、別のビュー(アウトレット「maskView」)があります。これは小さく、大きなビュー「coverView」の上にあります。私が欲しいのは、この「maskView」をマスクとして使用することです。そのため、ウィンドウのように、それを通して「backImage」を見ることができます。
これを理解できる人はいますか?
これが私の画面です。小さな白いビューを通して大きな灰色のビューの背後にある女性キャラクターを見たいです。
マスクビューからalpha
プロパティを設定し、他のビューの前に追加できます。次に例を示します。
let maskView = UIView()
maskView.backgroundColor = UIColor(white: 0, alpha: 0.5) //you can modify this to whatever you need
maskView.frame = CGRect(x: 0, y: 0, width: imageView.frame.width, height: imageView.frame.height)
yourView.addSubview(maskView)
編集:質問を画像で編集したので、必要なものがわかりました。これを実行する方法を次に示します。
func setMask(with hole: CGRect, in view: UIView){
// Create a mutable path and add a rectangle that will be h
let mutablePath = CGMutablePath()
mutablePath.addRect(view.bounds)
mutablePath.addRect(hole)
// Create a shape layer and cut out the intersection
let mask = CAShapeLayer()
mask.path = mutablePath
mask.fillRule = kCAFillRuleEvenOdd
// Add the mask to the view
view.layer.mask = mask
}
この関数を使用すると、必要なのは、ビューを作成し、そのビューの穴になる形状を作成することだけです。たとえば、次のようになります。
// Create the view (you can also use a view created in the storyboard)
let newView = UIView(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height))
newView.backgroundColor = UIColor(white: 0, alpha: 1)
// You can play with these values and find one that fills your need
let rectangularHole = CGRect(x: view.bounds.width*0.3, y: view.bounds.height*0.3, width: view.bounds.width*0.5, height: view.bounds.height*0.5)
// Set the mask in the created view
setMask(with: rectangularHole, in: newView)
ありがとう、@ Alexandre Lara!できたね!
ここに解決策があります:
@IBOutlet weak var windowView: UIView!
@IBOutlet weak var bigCoverView: UIView!
func setMask(with hole: CGRect, in view: UIView){
// Create a mutable path and add a rectangle that will be h
let mutablePath = CGMutablePath()
mutablePath.addRect(view.bounds)
mutablePath.addRect(hole)
// Create a shape layer and cut out the intersection
let mask = CAShapeLayer()
mask.path = mutablePath
mask.fillRule = kCAFillRuleEvenOdd
// Add the mask to the view
view.layer.mask = mask
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let rectangularHole = windowView.frame.integral
// Set the mask in the created view
setMask(with: rectangularHole, in: bigCoverView!)
}