web-dev-qa-db-ja.com

UIViewにシャドウをマスクして追加する方法

マスクしてシャドウを追加したいカスタムビューを作成しています。

マスキング:

    let p = UIBezierPath()
    p.moveToPoint(CGPointMake(20, 20))
    p.addLineToPoint(CGPointMake(100, 20))
    p.addLineToPoint(CGPointMake(100, 50))
    p.addLineToPoint(CGPointMake(110, 55))
    p.addLineToPoint(CGPointMake(100, 60))
    p.addLineToPoint(CGPointMake(100, 100))
    p.addLineToPoint(CGPointMake(20, 100))
    p.closePath()

    let s = CAShapeLayer()
    s.frame = layer.bounds
    s.path = p.CGPath
    s.fillColor = UIColor.greenColor().CGColor
    layer.mask = s

マスキングが機能するので、シャドウを追加します。しかし、それは機能していません。

メインレイヤーにシャドウを追加しようとしましたが、何も起こりません。

    layer.shadowColor = UIColor.yellowColor().CGColor
    layer.shadowRadius = 10
    layer.shadowOpacity = 0.9
    layer.shadowOffset = CGSizeZero

それをマスクレイヤーに追加しようとすると、メインビューが影でマスクされました。

    s.shadowColor = UIColor.yellowColor().CGColor
    s.shadowRadius = 10
    s.shadowOpacity = 0.9
    s.shadowOffset = CGSizeZero

この黄色い影をマスクされたビューに追加する方法について何か提案はありますか?

ありがとう

12
ilan

@WilsonXJに感謝します。マスクをaddSubLayerに変更しました。

これは私のために働いた答えです:

    let p = UIBezierPath()
    p.moveToPoint(CGPointMake(20, 20))
    p.addLineToPoint(CGPointMake(100, 20))
    p.addLineToPoint(CGPointMake(100, 50))
    p.addLineToPoint(CGPointMake(110, 55))
    p.addLineToPoint(CGPointMake(100, 60))
    p.addLineToPoint(CGPointMake(100, 100))
    p.addLineToPoint(CGPointMake(20, 100))
    p.closePath()

    let s = CAShapeLayer()
    s.fillColor = UIColor.whiteColor().CGColor
    s.frame = layer.bounds
    s.path = p.CGPath

    layer.backgroundColor = UIColor.clearColor().CGColor
    layer.addSublayer(s)

    layer.masksToBounds = true
    layer.shadowColor = UIColor.yellowColor().CGColor
    layer.shadowOffset = CGSizeZero
    layer.shadowOpacity = 0.9
    layer.shadowPath = p.CGPath
    layer.shadowRadius = 10
9
ilan

サブビューをレイヤーでカバーしたくない場合は、次を置き換えます。

        layer.addSublayer(s)

沿って

        for subview in subviews {
            layer.insertSublayer(s, below: subview.layer)
        }
0
Henry Declety

layer.maskの使用法がなくなったため、現在の答えが正しいとは思いません。

layer.maskを使用してマスクされたレイヤーのシャドウをドロップする必要がある場合、明らかな解決策は、マスクされたレイヤーの下にlayer.maskと同じ形状の別のレイヤーを追加し、そのシャドウをドロップすることです。

例:

let view = UIView(frame: CGRect(Origin: .zero, size: CGSize(width: 500, height: 500)))
view.backgroundColor = .white
PlaygroundPage.current.liveView = view

let path: CGPath = ...

let maskedView = UIView(frame: path.boundingBox)
maskedView.center = view.center
maskedView.backgroundColor = .green
view.addSubview(maskedView)

let maskLayer = CAShapeLayer()
maskLayer.frame = maskedView.bounds
maskLayer.path = path
maskedView.layer.mask = maskLayer

let shadowLayer = CAShapeLayer()
shadowLayer.path = path
shadowLayer.frame = maskedView.frame

shadowLayer.shadowOpacity = 0.4
shadowLayer.shadowRadius = 2
shadowLayer.shadowColor = UIColor.black.cgColor
shadowLayer.shadowOffset = CGSize(width: 4, height: 4)

maskedView.superview!.layer.insertSublayer(shadowLayer, below: maskedView.layer)
0
Kirow