churabou / iOS-develop-blog

0 stars 0 forks source link

4月29日(日) CALayerのマスクについてはまった、UIColorのdocument初めて読んだ。 #15

Open churabou opened 6 years ago

churabou commented 6 years ago
    override func viewDidLoad() {

        let maskLayer = CAShapeLayer()
        maskLayer.bounds = view.bounds
        maskLayer.fillRule = kCAFillRuleEvenOdd
        maskLayer.fillColor = UIColor.black.cgColor

        let maskPath = UIBezierPath(rect: view.frame)
        maskPath.append(UIBezierPath(ovalIn: view.frame.insetBy(dx: 10, dy: 10)))
        maskLayer.path = maskPath.cgPath
        view.layer.mask = maskLayer        
    }

支店が左上。

maskLayerのframeとか変更しちゃダメでした。 ハマりました。溶けました。

churabou commented 6 years ago

UIColor

xcodeの警告出るけどまだ古いまま。

self.backgroundView.backgroundColor = UIColor.gray()
self.backgroundView.tintColor = UIColor.blue()
churabou commented 6 years ago

class ViewController: UIViewController {

    private lazy var imageView: UIView = {
        let v = UIView()
        v.backgroundColor = .red
        v.frame = view.bounds.insetBy(dx: 50, dy: 150)
        return v
    }()

    private lazy var maskLayer: CAShapeLayer = {
        let l = CAShapeLayer()
        l.fillRule = kCAFillRuleEvenOdd
        l.fillColor = UIColor.black.cgColor
        return l
    }()

    private lazy var maskView: MaskView = {
        let v = MaskView()
        v.backgroundColor = .black
        v.frame = imageView.bounds
        v.addGestureRecognizer(pan)
        v.layer.mask = maskLayer
        return v
    }()

    private lazy var pan: UIPanGestureRecognizer = {
        let p = UIPanGestureRecognizer(target: self, action: #selector(move))
        return p
    }()

    @objc func move(_ sender: UIPanGestureRecognizer) {
        let location = sender.location(in: imageView)
        updateMask(location)
    }

    func updateMask(_ center: CGPoint) {

        let maskPath = UIBezierPath(rect: maskView.bounds)
        let r: CGFloat = 50
        maskPath.append(UIBezierPath(ovalIn: CGRect(x: center.x-r,
                                                    y: center.y-r,
                                                    width: 2*r,
                                                    height: 2*r)))
        maskLayer.path = maskPath.cgPath
    }

    override func viewDidLoad() {

        view.addSubview(imageView)
        imageView.addSubview(maskView)
        updateMask(maskView.center)
    }
}

これをUIViewをそもままmaskしたいけどうまくいかなかった。

UIView.mask = UIView() は UIView.layer.mask = UIView().layer.mask と同値じゃないの?

試したこと

class MaskView: UIView { override class var layerClass: AnyClass { return CAShaperLayer.self } } にしてview.layer.mask = maskview.layerみたいにしてみたり