2017-08-20 13 views
0

私は、後ろの画像を見るために特定の場所で透明なビューを作成しようとしています。しかし、何らかの理由でビューの透明部分で、私はビューの背後にあるものの代わりに黒く表示されています。私は非常に小さなコードにそれをトリミングして、私の透明​​なビューが赤の代わりに黒(後ろのビューの色)を示す理由を理解していない。透明なビューは黒ですか?

class ViewController: UIViewController { 

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 
     let redView = UIView(frame: view.frame) 
     redView.backgroundColor = UIColor.red 
     let transparentView = TransparentView(frame: view.frame) 

     view.addSubview(redView) 
     view.addSubview(transparentView) 
    } 
} 

class TransparentView: UIView { 

    override func draw(_ rect: CGRect) { 
     UIColor.clear.setFill() 
     UIRectFill(rect) 
} 

が、私は画面が赤いいっぱいであることを期待するが、その代わりに、それは完全な黒を示しています。ここに私のコードです。誰かが明瞭なビューを作るのがはるかに簡単だと言う前に、私は実際にdrawRectでもっと複雑なことをしようとしています。私の問題をデバッグしようとする最も基本的なものに落としました。私はここで何が欠けていますか?

+0

'self.opaque = false;'これを 'TransparentView'コンストラクタに追加します。それで、あなたは 'draw'メソッドであなたが望むものを何でもすることができます。 – Brandon

答えて

3

drawRectが上書きされた場合でも使用self.isOpaque = false;がビュー/レイヤー透明にします。

class TransparentView: UIView { 

    override init(frame: CGRect) { 
     super.init(frame: frame); 

     self.isOpaque = false; //Use this.. 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    override func draw(_ rect: CGRect) { 
     UIColor.clear.setFill() 
     UIRectFill(rect) 
    } 
} 
+0

ああ、私はそのプロパティを知らなかった、おそらくこれは私のソリューションよりも少しきれいです。 –

+0

実際にそのプロパティを設定しても振る舞いは変わりません –

+0

私は馬鹿です私はisOpaqueをtrueに設定しました。これは動作します –

0

私はそれを理解しました。明らかにdrawをオーバーライドしても、backgroundColorは引き続き考慮されているように見え、デフォルトは黒です。私は透明のビュークラスに次を追加しました:

override init(frame: CGRect) { 
    super.init(frame: frame) 

    backgroundColor = UIColor.clear 
} 

required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 
0

「のdrawRect:あなたのビューは、カスタムコンテンツを描画する場合は、このメソッドを実装し、あなたのビューは、任意のカスタム描画を行わない場合は、このメソッドをオーバーライドすることは避けてください。。」 Link

これは、Initの背景色を設定しただけでいいと言われています。

override init(frame: CGRect) { 
    super.init(frame: frame) 

    backgroundColor = UIColor.clear 
} 

required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

個人的に私は非常にカスタマイズされたビューをサブクラス化しません。作成中に設定してください。また、viewWillAppearではなく、viewDidLoadの方がビューの設定が優れています。あなたのビューがフォアグラウンドになるたびに実行されるので、2つの透明なビューを追加して終了します。 また、これらの行をプライベート関数で拡張しておくと、コードを明確にすることができます。

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     setupViews() 
    } 
} 


//MARK: - Private Methods 
extension ViewController{ 
    fileprivate func setupViews(){ 
     let redView = UIView(frame: view.frame) 
     redView.backgroundColor = UIColor.red 
     view.addSubview(redView) 

     let transparentView = UIView(frame: view.frame) 
     transparentView.backgroundColor = UIColor.clear 
     view.addSubview(transparentView) 
    } 
} 

より明確なアプローチは、ストーリーボード(ないコードによって)でこれらのビューを作成するであろうことに注意してください。コードを明確にし、理解しやすくし、何が起こっているか見る。

+0

@Kven DiTraglia私の解決策で終わりましたか?プラス私の答えが良い場合は、選択したものです。 +1はどうですか? – alegelos

+0

質問を再読した場合、drawRectを使用するのは簡単すぎると私は具体的に言いますが、実際のコードははるかに複雑で描画する必要があります。 –

関連する問題