web-dev-qa-db-ja.com

UIImageViewをマスキングするには何が必要ですか?Swift 3でどのように行うのですか?

マスク画像を使用してUIImageViewを特定の形状にするには、何が必要かと考えていました。私が理解していることから、マスクを作成するには、白い背景の上にすべて黒のマスクの形をした画像が必要です。たとえば、次のようなものです。

Star-shaped mask image

まず第一に、これは画像ビューを形作るのに十分です、そしてもしそうなら、どうすればそれをSwift 3?で行うことができますか? C.上の画像をUIImageViewに割り当ててから、画像ビューをmaskUIImageViewプロパティに割り当ててみました。

self.defaultImageView.mask = self.maskImageView

これは何もしませんでした。 self.maskImageView消えます(両方の画像ビューがストーリーボードを介して追加され、IBOutletプロパティを使用して接続されます)。私は何かをするのを忘れていると確信しています。これほど単純なことはできません。誰かが私を助けてくれたら幸いです。私が言ったように、私はストーリーボードのまったく同じ場所に、互いの上に両方の画像ビューを配置しました。

UPDATE:ストーリーボードからマスクを削除した後、プログラムでマスクを設定する最初の試み。

let layer:CALayer = CALayer()
    let mask:UIImage = UIImage(named: "Black-Star-Photographic-Agency")!
    layer.contents = mask
    layer.frame = CGRect(x: 0, y: 0, width: ((self.defaultImageView.image?.size.width)!), height: (self.defaultImageView.image?.size.height)!)
    self.defaultImageView.layer.mask = layer
    self.defaultImageView.layer.masksToBounds = true

その結果、画像ビューが完全に消えて、表示されなくなりました。私は何かをしているのですか、何かを忘れているのですか、それとも両方ですか?

11
Freddy Benson

Jpgとは異なり、透明度をサポートするpng画像を使用する必要があります。

Photoshopでは、画像は次のようになります。

enter image description here

あなたの形が黒か白かは関係ありません。重要なのは各ピクセルの透明度です。不透明な領域(この場合は黒)が表示され、透明な領域がトリミングされます。

編集:

ストーリーボードからマスクビューを作成する場合は、作成しないでください。ビュー階層の一部にはなりません。次のようにプログラムで追加するだけです。

let maskView = UIImageView()

override func viewDidLoad() {
    super.viewDidLoad()
    maskView.image = UIImage(named: "mask")
    imageView.mask = maskView        
}

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    maskView.frame = imageView.bounds
}

出力:

enter image description here

ここ はそれがどのように機能するかを示すためのテストプロジェクトです。

17
alexburtnik

また、カスタムフレーム/画像を使用していて、マスクが正しく表示されない場合は、マスクのコンテンツモードを設定してみてください。

maskView.contentMode = .scaleAspectFit
2
Larry Mickie