2015-12-14 12 views
32

Ho progettato gli elementi dell'interfaccia utente nello schizzo e uno di essi ha un'ombreggiatura con sfocatura 1 e spread 0. Ho guardato il documento per la proprietà del livello visualizzazioni e il livello non ha alcun nome denominato diffusione o sfocatura, o qualcosa di equivalente (il solo il controllo era semplicemente shadowOpacity) Come controllare le cose come la sfocatura e la diffusione?Come controllare la diffusione dell'ombra e la sfocatura?

EDIT:

Qui sono le mie impostazioni in Sketch: Sketch shadow settings


e qui è quello che voglio la mia ombra a guardare come:

Shadow wanted




E ecco come appare al momento:

Current shadow
Nota, è necessario fare clic sull'immagine per vedere effettivamente l'ombra.

Il mio codice è il seguente:

func setupLayer(){ 
    view.layer.cornerRadius = 2 
    view.layer.shadowColor = Colors.Shadow.CGColor 
    view.layer.shadowOffset = CGSize(width: 0, height: 1) 
    view.layer.shadowOpacity = 0.9 
    view.layer.shadowRadius = 5 
} 
+0

Potete spiegare brevemente con snapshot e codice –

+0

Ho aggiunto alcune immagini e un po 'di codice, spero che questo sia più chiaro. – Quantaliinuxite

+0

I tag ios (la piattaforma), il design (l'uso del software Sketch) e Core-Graphics (è possibile utilizzare un UIBezierPath per disegnare l'ombra, che potrebbe essere rilevante) sono tutti rilevanti, non vedo perché dovrebbe essere rimosso. – Quantaliinuxite

risposta

48

Si può provare questo .... si può giocare con i valori. Il shadowRadius determina la quantità di sfocatura. shadowOffset indica dove va l'ombra.

Swift 2,0

let radius: CGFloat = demoView.frame.width/2.0 //change it to .height if you need spread for height 
let shadowPath = UIBezierPath(rect: CGRect(x: 0, y: 0, width: 2.1 * radius, height: demoView.frame.height)) 
//Change 2.1 to amount of spread you need and for height replace the code for height 

demoView.layer.cornerRadius = 2 
demoView.layer.shadowColor = UIColor.blackColor().CGColor 
demoView.layer.shadowOffset = CGSize(width: 0.5, height: 0.4) //Here you control x and y 
demoView.layer.shadowOpacity = 0.5 
demoView.layer.shadowRadius = 5.0 //Here your control your blur 
demoView.layer.masksToBounds = false 
demoView.layer.shadowPath = shadowPath.CGPath 

Swift 3,0

let radius: CGFloat = demoView.frame.width/2.0 //change it to .height if you need spread for height 
let shadowPath = UIBezierPath(rect: CGRect(x: 0, y: 0, width: 2.1 * radius, height: demoView.frame.height)) 
//Change 2.1 to amount of spread you need and for height replace the code for height 

demoView.layer.cornerRadius = 2 
demoView.layer.shadowColor = UIColor.black.cgColor 
demoView.layer.shadowOffset = CGSize(width: 0.5, height: 0.4) //Here you control x and y 
demoView.layer.shadowOpacity = 0.5 
demoView.layer.shadowRadius = 5.0 //Here your control your blur 
demoView.layer.masksToBounds = false 
demoView.layer.shadowPath = shadowPath.cgPath 

Esempio con diffusione

Example with spread

Per creare un'ombra base

demoView.layer.cornerRadius = 2 
    demoView.layer.shadowColor = UIColor.blackColor().CGColor 
    demoView.layer.shadowOffset = CGSizeMake(0.5, 4.0); //Here your control your spread 
    demoView.layer.shadowOpacity = 0.5 
    demoView.layer.shadowRadius = 5.0 //Here your control your blur 

esempio di base Ombra a Swift 2.0

OUTPUT

+2

L'informazione è sbagliata, l'offset non è un controllo di spread, è un controllo di xey. – Quantaliinuxite

+0

@Quantaliinuxite ho scambiato accidentalmente i commenti ho aggiornato le risposte –

+0

Giusto, e ora arriva il nocciolo della mia domanda: come controllo lo spread? – Quantaliinuxite

4

Questo codice ha funzionato molto bene per me:

yourView.layer.shadowOpacity = 0.2 // opacity, 20% 
yourView.layer.shadowColor = UIColor.black.cgColor 
yourView.layer.shadowRadius = 2 // HALF of blur 
yourView.layer.shadowOffset = CGSize(width: 0, height: 2) // Spread x, y 
yourView.layer.masksToBounds = false 
+0

Il valore di sfocatura nello schizzo ** non ** corrisponde al raggio di ombra dell'anima core. – LucasTizma

+1

ok @ Lucasizma. Saluti. btw wow nice Adoro l'app Airbnb per il ruolo iOS – Cesare

+0

Ciò che ha funzionato abbastanza vicino per noi è stato il dimezzamento del valore di sfocatura nel raggio di ombreggiatura di Sketch for Core Animation. – LucasTizma

1

La mia soluzione basata su questo post risposte: (Swift 3)

let shadowPath = UIBezierPath(rect: CGRect(x: -1, 
              y: -2, 
              width: target.frame.width + 2, 
              height: target.frame.height + 2)) 

target.layer.shadowColor = UIColor(hexString: shadowColor).cgColor 
target.layer.shadowOffset = CGSize(width: CGFloat(shadowOffsetX), height: CGFloat(shadowOffsetY)) 
target.layer.masksToBounds = false 
target.layer.shadowOpacity = Float(shadowOpacity) 
target.layer.shadowPath = shadowPath.cgPath 
7

Ecco come applicare tutti e 6 Schermate le proprietà dell'ombra sul livello di un UIView con una precisione quasi perfetta:

extension CALayer { 
    func applySketchShadow(
    color: UIColor = .black, 
    alpha: Float = 0.5, 
    x: CGFloat = 0, 
    y: CGFloat = 2, 
    blur: CGFloat = 4, 
    spread: CGFloat = 0) 
    { 
    shadowColor = color.cgColor 
    shadowOpacity = alpha 
    shadowOffset = CGSize(width: x, height: y) 
    shadowRadius = blur/2.0 
    if spread == 0 { 
     shadowPath = nil 
    } else { 
     let dx = -spread 
     let rect = bounds.insetBy(dx: dx, dy: dx) 
     shadowPath = UIBezierPath(rect: rect).cgPath 
    } 
    } 
} 

diciamo che vogliamo rappresentare il seguente:

enter image description here

Si può facilmente farlo tramite:

myView.layer.applySketchShadow(
    color: .black, 
    alpha: 0.5, 
    x: 0, 
    y: 0, 
    blur: 4, 
    spread: 0) 

o più brevemente:

myView.layer.applySketchShadow(y: 0) 

Esempio:

enter image description here

Sinistra: iPhone 8 UIView screenshot; a destra: rettangolo di schizzo.

Nota:

  • Quando si utilizza un diverso da zero spread, esso hardcodes un percorso basato sul bounds del CALayer. Se i limiti del livello cambiano, dovresti chiamare di nuovo il metodo applySketchShadow().
+1

Questa dovrebbe essere la risposta accettata. –

Problemi correlati