2013-09-02 12 views
14

Szukam utworzyć gradient podobny do cienia w moim UIImageView, podobnie jak w Flipboard.Gradient/cienie w UIImageView like Flipboard

Przykładem jest to obraz w obrazie tym

http://taitegallery.net/wp-content/uploads/2012/01/flipboard-iphone.jpg

Jak widać na prawym iPhone, jest ciemniejsze gradientu na górze i na dole. Jest tak, że jeśli obraz jest biały, nadal widać biały tekst.

Ktoś ma jakieś sugestie, w jaki sposób mogę to zaimplementować? Jestem nowy w rozwoju iOS, więc nieświadomy tego. Dzięki!

+0

jak możesz zrobić tylko dno? – SleepsOnNewspapers

Odpowiedz

20

Można użyć CAGradientLayer:

  1. Dodaj QuartzCore.framework do projektu. (Patrz Linking to Library or Framework).

  2. importu nagłówek QuartzCore:

    #import <QuartzCore/QuartzCore.h> 
    
  3. Dodaj CAGradientLayer do widoku w pytaniu. Na przykład, za pomocą prostego gradientu od szarości do bieli:

    - (void)addGradientToView:(UIView *)view 
    { 
        CAGradientLayer *gradient = [CAGradientLayer layer]; 
        gradient.frame = view.bounds; 
        gradient.colors = @[(id)[[UIColor lightGrayColor] CGColor], 
             (id)[[UIColor whiteColor] CGColor]]; 
        [view.layer insertSublayer:gradient atIndex:0]; 
    } 
    

    Albo z jednym odcieniu szarości, do drugiego i odwrotnie:

    - (void)addGradientToView:(UIView *)view 
    { 
        CAGradientLayer *gradient = [CAGradientLayer layer]; 
        gradient.frame = view.bounds; 
        gradient.colors = @[(id)[[UIColor colorWithRed:0.8 green:0.8 blue:0.8 alpha:1.0] CGColor], 
             (id)[[UIColor colorWithRed:0.9 green:0.9 blue:0.9 alpha:1.0] CGColor], 
             (id)[[UIColor colorWithRed:0.8 green:0.8 blue:0.8 alpha:1.0] CGColor]]; 
        [view.layer insertSublayer:gradient atIndex:0]; 
    } 
    

wystarczy zmienić kolory w tablicy colors zmienić gradient, aby osiągnąć pożądany efekt. Możesz umieścić widok obrazu w widoku kontenera i zastosować gradient do widoku kontenera, a nie do widoku obrazu. Co więcej, prawdopodobnie jest to oczywiste, ale zakłada się, że obrazy, które używasz w swoim UIImageView, wykorzystują przezroczyste tło. Jeśli nie, musisz je zmienić (a) zbuduj gradient bezpośrednio na obrazie; lub (b) zastąpić tło obrazu przezroczystością, aby można było zobaczyć powyższy efekt.

+0

Hi @Rob, w odniesieniu do powyższego przykładu, wtrąciłem kody i udało mi się osiągnąć pożądane rezultaty, gdy potrzebuję subtelnego gradientu u góry i/lub u dołu mojego UIImageView. W '.tablica kolorów, miałem '(id) [[UIColor colorWithWhite: 0 alpha: 0.8] CGColor]' i '(id) [[UIColor clearColor] CGColor]'. ClearColor pozwoliło mi pokazać podstawowy obraz bez konieczności radzenia sobie z problemami z przezroczystością. I uważam, że nie musiałem również "view.backgroundColor = [UIColor clearColor];". Przyjmuję Twoją odpowiedź, jeśli mógłbyś wprowadzić odpowiednie zmiany? –

+0

@Ryan Re the backgroundColor, masz rację, nie potrzebujesz tego (choć podobno jest to użyteczne, jeśli stosujesz gradienty do innych kontrolek UIKit i na pewno tutaj nie boli). Jeśli chodzi o użycie clearColor w gradiencie, jest to konieczne tylko wtedy, gdy gradient znajduje się nad obrazem (co oznacza, że ​​kolory na pierwszym planie również zostaną nieznacznie zmienione.) Potrzebujesz efektu tylko na tle i jeśli potrzebujesz 'clearColor', aby praca, to jest coś złego. Umieściłbym gradient na widoku kontenera, na którym umieszczany jest UIImageView, a nie na samym obrazie, ale cokolwiek działa, – Rob

+0

Tak naprawdę próbuję zastosować ten gradient do samego UIImageView i nie wprowadzaj w tym przypadku innych widoków, ponieważ wszystko, czego potrzebuję, to obraz, który ma ciemny gradient na dole, więc niezależnie od koloru mojego obrazu, tekst jest nadal czytelny, jak widać w powyższym przykładzie, ale dzięki! –

0

Zrobiłem ten efekt w moich aplikacjach przed nałożeniem przezroczystego obrazu zawierającego przyciemnione obszary na zdjęciu. Wdrożenie jest mądre, co zwykle oznacza wstawienie kolejnego widoku z widoku zdjęcia w hierarchii widoku.

6

w dzisiejszych czasach to praca właściwie stosując prawo w UIImageView warstwy

// Set image over layer 
CAGradientLayer *gradient = [CAGradientLayer layer]; 
gradient.frame = imageView.frame; 

// Add colors to layer 
UIColor *centerColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.25]; 
UIColor *endColor = [UIColor grayColor]; 
gradient.colors = [NSArray arrayWithObjects: 
           (id)[endColor CGColor], 
           (id)[centerColor CGColor], 
           (id)[endColor CGColor], 
           nil]; 

[imageView.layer insertSublayer:gradient atIndex:0]; 

zabrać go z here

+1

Zauważyłem, że powinno to być: gradient.frame = imageView.bounds – chinjazz

+0

Czy ktoś może przetłumaczyć to na Swift? –

0

tłumaczona na Swift:

var gradient = CAGradientLayer() 
gradient.frame = imageView.bounds      
let startColor = UIColor(colorLiteralRed: 0, green: 0, blue: 0, alpha: 0.25) 
let endColor = UIColor.grayColor() 
gradient.colors = [startColor, endColor] 
imageView.layer.insertSublayer(gradient, atIndex: 0) 
1

SWIFT 3

let gradient = CAGradientLayer() 
    gradient.frame = imageView.bounds 

    let startColor = UIColor(colorLiteralRed: 0, green: 0, blue: 0, alpha: 0.25) 
    let endColor = UIColor.gray 

    gradient.colors = [startColor.cgColor, endColor.cgColor] 
    imageView.layer.insertSublayer(gradient, at: 0) 
+0

ten kod nie zrobił nic na moim obrazieView ... jakikolwiek pomysł dlaczego? –

+0

.cgColor brakuje na kolor początkowy i końcowy. CAGradientLayer akceptuje tylko CGColors, a nie UIColors –