2015-07-22 3 views
0

Я реализовал UIView с закругленным прямоугольником только в верхнем левом и верхнем правом углах, используя UIBezierPath. Но после этого, когда я добавляю тень к виду, он не показывает тень. Если я просто удалю закругленные углы безье, тогда тень работает отлично. Но теперь только закругленные углы появляются без тени. Вот мой кодShadow не работает с UIViewLayer с маской

override func drawRect(rect: CGRect) 
{ 
    super.drawRect(rect) 

    let shapeLayer : CAShapeLayer = CAShapeLayer(layer: centerView.layer) 
    shapeLayer.path = UIBezierPath(roundedRect: centerView.layer.bounds, byRoundingCorners: UIRectCorner.TopRight|UIRectCorner.TopLeft, cornerRadii: CGSizeMake(15,15)).CGPath 
    centerView.layer.mask = shapeLayer 

    centerView.layer.masksToBounds = false 

    centerView.layer.shadowOffset = CGSizeMake(0,-2) 
    centerView.layer.shadowRadius = 0.5 
    centerView.layer.shadowOpacity = 0.7 
    centerView.layer.shadowColor = UIColor(red: 0.867, green: 0.867, blue: 0.867, alpha: 1).CGColor 
    centerView.layer.shadowPath = UIBezierPath(roundedRect: centerView.layer.bounds, byRoundingCorners: UIRectCorner.TopRight|UIRectCorner.TopLeft, cornerRadii: CGSizeMake(15,15)).CGPath 
} 

Здесь я переопределить DrawRect в виде UITableViewCell и CENTERVIEW является подвид этого. Также я попробовал подклассифицировать UIView для centerView, что тоже не работает.

Имеет ли свойство маски и свойство maskToBounds объекта CALayer друг с другом?

+0

Почему вы делаете это в drawRect? Вы даже не используете переменную 'rect' - этот вид вещей должен выполняться в' layoutSubviews'. По крайней мере ** макет **. Создание слоев должно выполняться во время начальной настройки - вы не должны создавать новый слой для каждого вызова ничьей. – luk2302

+0

ОК. Но это не решает проблему. Тем не менее проблема остается –

ответ

2

После того, как вы примените маскирующий слой к виду, это представление будет привязано к слою маскирования. Тень представления также будет обрезана, поэтому она не будет нарисована. Общим решением этой проблемы является наличие 2 представлений. Один из них - для создания тени, а другой - для маскировки. В вашем случае, centerView - это маскирующий вид, поскольку вы устанавливаете слой маскирования на слой centerView. Что вам нужно сделать, так это создать новое представление, назовем его containerView. Добавьте centerView в containerView и установите тень в представлении контейнера вместо centerView.

+0

Вот что я сделал. Спасибо за ответ. – shinoys222

Смежные вопросы