2016-11-17 2 views
2

Я бы очень признателен, если бы кто-нибудь мог сказать мне, почему приведенный ниже код не дает мне внутренней тени или дает мне решение, которое даст внутреннюю тень.Swift Создание внутренней тени на круглом UIView

Мне нужно создать внутреннюю тень на закругленном UIView. Я прошел через множество ответов и нашел способы получить это на обычном квадрате UIViews, но не нашел решения, которое работает на округленное представление. Вместо этого я нахожу решения, подобные приведенным ниже, которые выглядят хорошо для меня, но не создавайте требуемую внутреннюю тень, когда я их реализую. Вот мой экран, это белый вид между наружными синими и внутренними желтыми взглядами, которые я хочу, чтобы добавить тень:

outer

Я подклассы мнения, вот мой Жеребьевка Прямоугольник код:

let innerShadow = CALayer() 
    // Shadow path (1pt ring around bounds) 
    let path = UIBezierPath(rect: innerShadow.bounds.insetBy(dx: -1, dy: -1)) 
    let cutout = UIBezierPath(rect: innerShadow.bounds).reversing() 
    path.append(cutout) 
    innerShadow.shadowPath = path.cgPath 
    innerShadow.masksToBounds = true 
    // Shadow properties 
    innerShadow.shadowColor = UIColor.darkGray.cgColor 
    innerShadow.shadowOffset = CGSize(width: 0.0, height: 7.0) 
    innerShadow.shadowOpacity = 1 
    innerShadow.shadowRadius = 5 
    // Add 
    self.layer.addSublayer(innerShadow) 

    // Make view round 
    self.layer.cornerRadius = self.frame.size.width/2 
    self.layer.masksToBounds = true 

Большое спасибо за любую помощь в этом. Пожалуйста, дайте мне знать, если у вас есть вопросы.

ответ

0

Только узнал об этом вчера

Замаскируйте круг от центра синего зрения

let maskLayer = CAShapeLayer() 

    // based on the image the ring is 1/6 its diameter 
    let radius = self.bounds.width * 1.0/6.0 
    let path = UIBezierPath(rect: self.bounds) 
    let holeCenter = CGPoint(x: center.x - (radius * 2), y: center.y - (radius * 2)) 

    path.addArc(withCenter: holeCenter, radius: radius, startAngle: 0, endAngle: CGFloat(2 * Double.pi), clockwise: true) 

    maskLayer.path = path.cgPath 
    maskLayer.fillRule = kCAFillRuleEvenOdd 

    blueView.layer.mask = maskLayer 

выше даст вам синее кольцо.

Далее создайте blackView, который будет действовать как наша тень

var blackView = UIView() 

Установите его кадр, чтобы быть таким же, как синий взгляд.

blackView.frame = blueView.frame 
blackView.clipToBounds = true 

Вырежьте аналогичное отверстие от blackView

let maskLayer = CAShapeLayer() 

    // This is the most important part, the mask shadow allows some of the black view to bleed from under the blue view and give a shadow 
    maskLayer.shadowOffset = CGSize(width: shadowX, height: shadowY) 
    maskLayer.shadowRadius = shadowRadius 

    let radius = self.bounds.width * 2.0/6.0 
    let path = UIBezierPath(rect: self.bounds) 
    let holeCenter = CGPoint(x: center.x - (radius * 2), y: center.y - (radius * 2)) 
    path.addArc(withCenter: holeCenter, radius: radius, startAngle: 0, endAngle: CGFloat(2 * Double.pi), clockwise: true) 

    maskLayer.path = path.cgPath 
    maskLayer.fillRule = kCAFillRuleEvenOdd 

    blackView.layer.mask = maskLayer 
Смежные вопросы