私はSwiftでプログラミングしています。CALayerとUIImageを使用して画像をマスクしたい。プログラムでマスク画像を作成しています。作成されたマスク画像はUIImageであり、単独で表示すると正常に機能します。でもマスクとして使うと画面全体が白くなります。私の問題はCALayerオブジェクトの構成にあると思われます。よろしくお願いします。ありがとう!
class ViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
var maskImageSize = CGSizeMake(self.imageView.frame.width, self.imageView.frame.height)
UIGraphicsBeginImageContextWithOptions(maskImageSize, false, 0.0)
var color = UIColor(white: 1.0, alpha: 1.0)
color.setFill()
var rect = CGRectMake(0, 0, self.imageView.frame.width, self.imageView.frame.height)
UIRectFill(rect)
color = UIColor(white: 0.0, alpha: 1.0)
color.setFill()
rect = CGRectMake((self.imageView.frame.width/2)-100, (self.imageView.frame.height/2)-100, 200, 200)
UIRectFill(rect)
var maskImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
var maskLayer = CALayer()
maskLayer.contents = maskImage
maskLayer.contentsRect = CGRectMake(0, 0, self.imageView.bounds.width, self.imageView.bounds.height)
self.imageView.image = UIImage(named: "pictobemasked.png")
self.imageView.layer.mask = maskLayer;
}
}
残念ながら、あなたはかなりひどい質問をしました-あなたは実際に何をしようとしているのかを言っていません!ただし、マスクを使用して画像ビューに長方形の穴を開けようとしているように見えます。もしそうなら、あなたのコードには少なくとも3つの大きな欠陥があります。
コードが機能しない理由の1つは、マスクが色ではなく透明度に基づいていることです。不透明な白と不透明な黒を使用していますが、どちらも不透明なので、違いはありません。次のようにするには、2つの色が必要です。
var color = UIColor(white: 1.0, alpha: 1.0)
// ... and then, later ...
color = UIColor(white: 1.0, alpha: 0.0)
2番目の問題は、レイヤーにサイズがないことです。あなたはそれに1つを与える必要があります:
var maskLayer = CALayer()
maskLayer.frame = CGRectMake(
0, 0, self.imageView.bounds.width, self.imageView.bounds.height)
3番目の最大の問題は、マスク画像を抽出するのを忘れたため、マスク画像がマスクレイヤーに入らないことですCGImage
。
maskLayer.contents = maskImage.CGImage
contents
を抽出せずにUIImageに設定するとCGImage
、画像がサイレントにレイヤーに入るのに失敗するため、最後の1つは本当にキラーです。エラーメッセージ、クラッシュ、画像はありません。
コードにこれらの3つの修正を加えることで、マスクに画像に長方形の穴を開けさせることができました。したがって、それがあなたの目的である場合、それらの変更はそれを達成します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加