質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.23%

override func draw(_ rect: CGRect) が毎回呼び出されてしまう。

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 567

Shichi7

score 18

override func draw(_ rect: CGRect)が画面遷移のたびに呼び出されてしまい、背景の半透明のレイヤー何度も描かれるので、背景がどんどん濃くなってしまいます。viewDidloadのタイミングのみでの呼び出し、もしくは、addSublayerですでにaddされてる場合にはaddしないなどできないでしょうか??

import UIKit

class overlayCameraVIew: UIView {

    lazy var hollowPoint: CGPoint = {
        return CGPoint(
            x: self.bounds.width / 2.0,
            y: self.bounds.height / 2.0
        )
    }()

    override func awakeFromNib() {
        super.awakeFromNib()
        self.backgroundColor = UIColor.clear
    }

    override func draw(_ rect: CGRect) {
        super.draw(rect)

        // 繰り抜きたいレイヤーを作成する(今回は例として半透明にした)
        let hollowTargetLayer = CALayer()
        hollowTargetLayer.bounds = self.bounds
        hollowTargetLayer.position = CGPoint(
            x: self.bounds.width / 2.0,
            y: self.bounds.height / 2.0
        )
        hollowTargetLayer.backgroundColor = UIColor.black.cgColor
        hollowTargetLayer.opacity = 0.7

        // 四角いマスクレイヤーを作る
        let maskLayer = CAShapeLayer()
        maskLayer.bounds = hollowTargetLayer.bounds

        // 塗りを反転させるために、pathに四角いマスクレイヤーを重ねる
        let halfWidth = (self.bounds.width / 2) - 32 as CGFloat
        let ovalRect =  CGRect(
            x: self.hollowPoint.x - halfWidth,
            y: self.hollowPoint.y - halfWidth,
            width: halfWidth * 2.0,
            height: halfWidth * 2.0
        )
        // 完全な円
        //let path =  UIBezierPath(ovalIn: ovalRect)
        // 角丸の四角
        let path =  UIBezierPath(roundedRect: ovalRect, cornerRadius: 24)
        path.append(UIBezierPath(rect: maskLayer.bounds))

        maskLayer.fillColor = UIColor.black.cgColor
        maskLayer.path = path.cgPath
        maskLayer.position = CGPoint(
            x: hollowTargetLayer.bounds.width / 2.0,
            y: hollowTargetLayer.bounds.height / 2.0
        )
        // マスクのルールをeven/oddに設定する
        maskLayer.fillRule = kCAFillRuleEvenOdd
        hollowTargetLayer.mask = maskLayer

        // サブレイヤーとしてadd
        self.layer.addSublayer(hollowTargetLayer)
    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • fuzzball

    2018/10/10 09:10

    なぜこの処理を draw(_:) に書こうと思ったのでしょうか?

    キャンセル

  • Shichi7

    2018/10/10 17:51

    全てのコードを掲載しました!

    キャンセル

回答 1

0

drawは何度も呼び出されるものです。

drawの引数であるrectを利用していないようですので、draw関数内には書かず、ご自身で言及されているようにviewDidLoad等で追加すればよいのではないでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/09 22:03

    すみません。省略してしまったのですが、Rectを使っています。Rectを使ってる場合はどうしたらいいでしょうか?

    キャンセル

  • 2018/10/09 23:43

    現在提示されている処理はviewDidLoadに移して、Rectが必要な処理のみ実行すればLayerが何個も追加されることはなくなるのではないでしょうか。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る