2015-12-14 25 views
32

Zaprojektowałem elementy interfejsu użytkownika w szkicu, a jeden z nich ma cień z rozmyciem 1 i rozłożeniem 0. Spojrzałem na dokument dla właściwości warstwy widoku, a warstwa nie ma nic, co nazywa się rozłożeniem lub rozmyciem, lub czymś podobnym (jedynym kontrola była jedynie shadowOpacity) Jak kontrolować takie rzeczy jak rozmycie i rozprzestrzenianie?Jak kontrolować rozprzestrzenianie się cienia i rozmycie?

EDIT:

Oto moje ustawienia w szkicu: Sketch shadow settings


I tu jest to, co chcę mój cień wyglądać:

Shadow wanted




I Oto jak wygląda obecnie:

Current shadow
Uwaga, musisz kliknąć zdjęcie, aby zobaczyć cień.

Mój kod wygląda następująco:

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

Czy możesz krótko wyjaśnić z migawką i kodem –

+0

Dodałem kilka zdjęć i trochę kodu, mam nadzieję, że jest to bardziej przejrzyste. – Quantaliinuxite

+0

Znaczniki ios (platforma), projektowanie (użycie oprogramowania Sketch) i Core-Graphics (możliwe jest użycie obiektu UIBezierPath do rysowania cienia, co może być istotne) są istotne, nie rozumiem, dlaczego powinno być usunięte. – Quantaliinuxite

Odpowiedz

48

Można spróbować .... można grać z wartościami. The shadowRadius dyktuje ilość rozmycia. shadowOffset dyktuje, gdzie idzie cień.

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 

Przykład z rozprzestrzenianiem

Example with spread

dokonanie podstawowej cień

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 

podstawowe cień przykład Swift 2.0

OUTPUT

+2

Informacja jest błędna, offset nie jest kontrolą rozprzestrzeniania się, jest kontrolą x i y. – Quantaliinuxite

+0

@Quantaliinuxite Przez przypadek zamieściłem komentarze, które zaktualizowałem odpowiedzi –

+0

Dobrze, a teraz jest sedno mojego pytania: jak kontrolować rozprzestrzenianie? – Quantaliinuxite

4

Kod ten działa bardzo dobrze dla mnie:

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

Wartość rozmycia w szkicu ** nie ** odpowiada promieniowi cienia rdzenia animacji. – LucasTizma

+1

ok @LucasTizma. Twoje zdrowie. btw wow, uwielbiam gratulacje dla aplikacji Airbnb w roli na iOS. – Cesare

+0

W rezultacie udało nam się zmniejszyć o połowę wartość rozmycia w promieniu cienia Sketch for Core Animation. – LucasTizma

1

Moje rozwiązanie opiera się na tym stanowisku odpowiada: (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

Oto jak stosować wszystkie 6 Szkicuj właściwości cienia do warstwy UIView z niemal doskonałą dokładnością:

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 
    } 
    } 
} 

że chcemy reprezentować następujące:

enter image description here

Można łatwo to zrobić poprzez:

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

lub bardziej zwięźle:

myView.layer.applySketchShadow(y: 0) 

przykładu:

enter image description here

Lewy: iPhone 8 UIView ekranu; prawy: szkicuj prostokąt.

Uwaga:

  • Przy korzystaniu niezerową spread, to hardcodes ścieżkę opartą na bounds z CALayer. Jeśli ograniczenia warstwy kiedykolwiek się zmienią, należy ponownie wywołać metodę applySketchShadow().
+1

To powinna być zaakceptowana odpowiedź. –

Powiązane problemy