Добавить несколько маску в CALayer (1 для добавления угла) - PullRequest
0 голосов
/ 20 сентября 2018

Я хочу, чтобы пользовательский интерфейс был таким

Custom View

Я хочу, чтобы у этого вида был закругленный угол и тень на нем.

Здесьмоя иерархия View в Xib:

-Content View 
    - Shadow View
    - Container View
        - Left View
        - Concave View
        - Action View

Вот мой фрагмент для достижения текущего пользовательского интерфейса:

для вогнутого пути:

        let couponPath = UIBezierPath()
        let zeroPoint = CGPoint.zero
        couponPath.move(to: zeroPoint)
        couponPath.addLine(to: CGPoint(x: leftView.frame.width, y: zeroPoint.y))
        let radius = concaveView.frame.width / 2
        let centerX = zeroPoint.x + leftView.frame.width + radius
        couponPath.addArc(withCenter: CGPoint(x: centerX, y: zeroPoint.y), radius: radius, startAngle: CGFloat.pi, endAngle: 0, clockwise: false)
        couponPath.addLine(to: CGPoint(x: containerView.frame.width, y: zeroPoint.y))

        couponPath.addLine(to: CGPoint(x: containerView.frame.width, y: containerView.frame.height))

        couponPath.addArc(withCenter: CGPoint(x: leftView.frame.width + radius, y: containerView.frame.height), radius: radius, startAngle: CGFloat.pi * 0, endAngle: CGFloat.pi, clockwise: false)

        couponPath.addLine(to: CGPoint(x: zeroPoint.x, y: containerView.frame.height))
        couponPath.close()

И затем я создаю CALayer этот путь couponPath.

let shapeLayer = CAShapeLayer()
shapeLayer.path = couponPath.cgPath

И я маскирую его в свой контейнер. self.containerView.layer.mask = shapeLayer

Я пытался добавить тень, используя этот код.

let shadowLayer = CAShapeLayer()
shadowLayer.frame = containerView.frame
shadowLayer.path = shapeLayer.path
shadowLayer.shadowOpacity = 0.5
shadowLayer.shadowRadius = 5
shadowLayer.masksToBounds = false
shadowLayer.shadowOffset = CGSize(width: 0, height: 20)
self.shadowView.layer.addSublayer(shadowLayer)

Как я могу добавить еще одну маскировку, чтобы угол радиуса обзора контейнера?И есть ли лучший способ добавить тень вместо использования нового вида (ShadowView) и наложить на него тень?

Вот мой xib и вид Суть

Спасибо.

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

Я закончил тем, что использовал этот ответ для stackoverflow с некоторыми обычаями для добавления тени и угла на него.

Вот суть игровой площадки

0 голосов
/ 20 сентября 2018

Это должно помочь вам в отношении теней и закругленных углов.Вы устанавливаете слой shadowView, а не добавляете подслой.

class RoundedCornerView: UIView {

    var shadowView: UIView?

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

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setup()
    }

    func setup() {

        // Set the layer of the main view to have rounded corners
        layer.cornerRadius = 12.0
        layer.masksToBounds = true

        // Create a shadow view and its mask
        shadowView = UIView(frame: bounds)
        addSubview(shadowView!)
        sendSubviewToBack(shadowView!)

        shadowView?.layer.shadowColor = UIColor.black.cgColor
        shadowView?.layer.shadowOffset = 4.0
        shadowView?.layer.shadowOpacity = 0.4
        shadowView?.layer.shadowRadius = 12.0
        shadowView?.layer.shadowPath = UIBezierPath(roundedRect: layer.bounds, cornerRadius: layer.cornerRadius).cgPath

        shadowView?.layer.masksToBounds = false
        shadowView?.clipsToBounds = false

    }

}
...