2017-02-15 19 views
3

enter image description here UIViewをマスクするためのコンテンツとして画像を使用するCALayerを使用しようとしています。マスクのために私は複雑なpng画像を持っています。私がview.layer.maskとしてイメージを適用すると、私は自分が望むものとは逆の振る舞いをします。 CAlayerを元に戻す方法はありますか?私はCALayerのを逆にすることができます逆CAShapeLayersと変更可能なパス、何も上のいくつかの記事を見てきましたCALayerマスクを逆にする

layerMask = CALayer() 
guard let layerMask = layerMask else { return }  
layerMask.contents = #imageLiteral(resourceName: "mask").cgImage 
view.layer.mask = layerMask 
// What I would like to to is 
view.layer.mask = layerMask.inverse. // <--- 

:ここに私のコードです。 私ができることは、Photoshopで画像を反転させてアルファを反転させることですが、その問題はすべての画面サイズに合わせて正確なサイズの画像を作成できないことです。私はそれが理にかなってほしいと思う。

+0

「私はそれが意味をなさないことを願っています。それはしません。最初の場所でマスク画像を「後ろ向きに」描いたということです。まあ、それはばかげていた。マスク画像を正しく描画して、始めてみませんか? – matt

+0

その問題は、キーウィンドウの中央にマスクのサイズが固定されていることです。私がPhotoshopで「正しい」マスクを描くと、マスクがすべての画面サイズで動作することは決してありません。だから私は私のメインロゴからステンシルする必要があるマスクとして私の会社のロゴを使用して – arvidurs

+0

いいえ、私は従いません。 _your_ maskではじまり、_correct_ maskで始めるとうまくいけないのはなぜですか? – matt

答えて

5

私がやることは、リアルタイムでマスクを構築することです。これはロゴの黒いイメージがあれば簡単です。標準的な手法を使用して、ロゴイメージをリアルタイムで構築したイメージに描画して、イメージのサイズとロゴのサイズと配置を管理することができます。 「Mask To Alpha」CIFilterを使用すると、黒を透明に変換してレイヤーマスクとして使用できます。

だから、説明する。ここでは、背景画像です:これは、我々がフォアグラウンドで穴を開けどこ見てみたいものです。

enter image description here

ここで前景画像は、背景の上に横たわっている、だと、それを完全に隠し:

enter image description here

ここで(透明度を表す灰色を無視する)黒色で、ロゴは次のとおり

enter image description here

はここで正しいサイズの白い背景に、コードに描かれたロゴです:

enter image description here

そして最後に、ここで同じ画像がアルファCIFilterためにマスクとマスクに変換され、前景画像に添付することをですそのmaskとしてビュー:

enter image description here

さて、私は少し良く私の画像を選択している可能性がありますが、これは私が転がっていたものです。ロゴに黒が入っていても、フォアグラウンドの画像に穴を開けて背景の画像を見ていることがわかります。これはあなたがしたいと言ったものとまったく同じです。

キーステップは最後のものです。つまり、ロゴの白黒イメージ(im)をマスクに変換します。ここに私がそれをした方法があります:

let cim = CIImage(image:im) 
    let filter = CIFilter(name:"CIMaskToAlpha")! 
    filter.setValue(cim, forKey: "inputImage") 
    let out = filter.outputImage! 
    let cgim = CIContext().createCGImage(out, from: out.extent) 
    let lay = CALayer() 
    lay.frame = self.iv.bounds 
    lay.contents = cgim 
    self.iv.layer.mask = lay 
+0

はいそれです!どうもありがとうございます!コードを稼働させるだけでいいです。私はそれが動作するようになるとそれを投稿します。御時間ありがとうございます! – arvidurs

+0

重要な部分は、白黒画像を透明マスクに変換することです。これは確かにあなたに与えられます。秒でハングアップします。 – matt

+0

あなたは行き​​ます。最後の手順のコードを追加しました。これは、わからないと思われる部分です。 – matt

関連する問題