2015-03-18 2 views
3


У меня странный вопрос. Несмотря на то, что я прочитал много учебников о том, как это сделать, конечный результат показывает только строку безье, а не любую тень. Мой код очень прост:Swift draw shadow to uibezier path

 let borderLine = UIBezierPath() 
     borderLine.moveToPoint(CGPoint(x:0, y: y! - 1)) 
     borderLine.addLineToPoint(CGPoint(x: x!, y: y! - 1)) 
     borderLine.lineWidth = 2 
     UIColor.blackColor().setStroke() 
     borderLine.stroke() 

     let shadowLayer = CAShapeLayer() 
     shadowLayer.shadowOpacity = 1 
     shadowLayer.shadowOffset = CGSize(width: 0,height: 1) 
     shadowLayer.shadowColor = UIColor.redColor().CGColor 
     shadowLayer.shadowRadius = 1 
     shadowLayer.masksToBounds = false 
     shadowLayer.shadowPath = borderLine.CGPath 

     self.layer.addSublayer(shadowLayer) 

Что я делаю не так, как я не кажется, что вижу ничего плохого, но, конечно, я не прав, так как не появляется тень. Функция drawRect, basic UIVIew ничего лишнего там, x и y - ширина и высота кадра.
Большое спасибо заранее!

+0

Вы установили [самоуправления setClipsToBounds: НЕТ ] и [self.layer setMaskToBounds: NO]? –

+0

У меня есть shadowLayer.maskToBounds = false, а не клипы для границ. Должно ли это быть self или shadowLayer? EDIT: set self.clipsToBounds, ничего не происходит –

ответ

8

Я беру этот пример прямо из моего приложения PaintCode. Надеюсь это поможет.

//// General Declarations 
let context = UIGraphicsGetCurrentContext() 


//// Shadow Declarations 
let shadow = UIColor.blackColor() 
let shadowOffset = CGSizeMake(3.1, 3.1) 
let shadowBlurRadius: CGFloat = 5 

//// Bezier 2 Drawing 
var bezier2Path = UIBezierPath() 
bezier2Path.moveToPoint(CGPointMake(30.5, 90.5)) 
bezier2Path.addLineToPoint(CGPointMake(115.5, 90.5)) 
CGContextSaveGState(context) 
CGContextSetShadowWithColor(context, shadowOffset, shadowBlurRadius, (shadow as UIColor).CGColor) 
UIColor.blackColor().setStroke() 
bezier2Path.lineWidth = 1 
bezier2Path.stroke() 
CGContextRestoreGState(context) 
+0

У меня есть код paintcode, он приносит странные ошибки при копировании кода, поэтому я попытался научиться самому это делать, но я, похоже, не получил его ... Спасибо за ваши усилия хотя –

+0

Я думаю, это сделает вас счастливыми, если у вас есть - удаленные (которые я не добавил). Ваш ответ мне очень помог, даже если он был скопирован из приложения. Ура! –

+0

Можно ли нарисовать тень только штрихом линии? – JAHelia

1

Я предпочитаю способ добавления подслоя теней. Вы можете легко использовать следующую функцию (Swift 3,0):

func createShadowLayer() -> CALayer { 
    let shadowLayer = CALayer() 
    shadowLayer.shadowColor = UIColor.red.cgColor 
    shadowLayer.shadowOffset = CGSize.zero 
    shadowLayer.shadowRadius = 5.0 
    shadowLayer.shadowOpacity = 0.8 
    shadowLayer.backgroundColor = UIColor.clear.cgColor 
    return shadowLayer 
} 

И, наконец, вы просто добавить его к линии пути (CAShapeLayer):

let line = CAShapeLayer() 
let path = UIBezierPath() 
path.move(to: CGPoint(x: 0, y: 0)) 
path.addLine(to: CGPoint(x: 50, y: 100)) 
path.addLine(to: CGPoint(x: 100, y: 50)) 
line.path = path.cgPath 
line.strokeColor = UIColor.blue.cgColor 
line.fillColor = UIColor.clear.cgColor 
line.lineWidth = 2.0 
view.layer.addSublayer(line) 

let shadowSubLayer = createShadowLayer() 
shadowSubLayer.insertSublayer(line, at: 0) 
view.layer.addSublayer(shadowSubLayer)