2013-09-02 3 views
14

Я ищу, чтобы создать теневой градиент в моем UIImageView, как и в Flipboard.Градиент/тени в UIImageView как Flipboard

Примером этого является картина в этом изображении

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

Как вы можете видеть на правом iPhone, есть более темный градиент в верхней и нижней части. Это так, что если изображение белого цвета, белый текст все еще можно увидеть.

У кого-нибудь есть предложения о том, как я могу это реализовать? Я новичок в развитии iOS, поэтому не знаю об этом. Благодаря!

+0

как вы можете сделать только дно? – SleepsOnNewspapers

ответ

20

Вы можете использовать CAGradientLayer:

  1. Добавить QuartzCore.framework в проект. (См. Linking to Library or Framework).

  2. Импорт заголовка QuartzCore:

    #import <QuartzCore/QuartzCore.h> 
    
  3. Добавить CAGradientLayer в представление о котором идет речь. Например, для простого градиента от серого до белого:

    - (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]; 
    } 
    

    Или из одного оттенка серого цвета, с другой, и обратно:

    - (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]; 
    } 
    

Просто изменить цвета в вашем массиве colors, чтобы изменить градиент для достижения желаемого эффекта. Вы можете поместить изображение в представление контейнера и применить градиент к виду контейнера, а не к представлению изображения. Более того, предположительно очевидно, но это предполагает, что изображения, которые вы используете в своем UIImageView, используют прозрачные фоны. Если они этого не сделают, вам придется изменить их либо (a) построить градиент прямо в изображении; или (b) заменить фон изображения прозрачностью, чтобы можно было увидеть эффект выше CAGradientLayer.

+0

Привет @Rob, ссылаясь на ваш пример выше, я вмешивался в коды и смог достичь желаемых результатов, когда мне просто нужен тонкий градиент в верхней части и/или нижней части моего UIImageView. В '.colors', у меня был '(id) [[UIColor colorWithWhite: 0 alpha: 0.8] CGColor]' и '(id) [[UIColor clearColor] CGColor]'. ClearColor позволил мне показать основное изображение без необходимости решения каких-либо проблем с прозрачностью. И я обнаружил, что мне не нужно было «view.backgroundColor = [UIColor clearColor];». Я приму ваш ответ, если вы сможете внести изменения соответственно? –

+0

@Ryan Re backgroundColor, вы правы, вам это не нужно (хотя, как утверждается, это полезно, если применять градиенты к другим элементам управления UIKit, и это, конечно, здесь не повредит). Что касается использования clearColor в градиенте, это необходимо только в том случае, если ваш градиент находится над изображением (что означает, что цвета переднего плана будут слегка затронуты). Вы хотите получить эффект только на фоне, и если вам нужно «clearColor» для него работа, то есть что-то не так.Я бы поместил градиент в вид контейнера, на котором размещен UIImageView, а не на самом изображении. Но все работает – Rob

+0

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

0

Я сделал этот эффект в своих приложениях, просто наложив прозрачное изображение, содержащее затемненные области над фотографией. Реализация разумна, что обычно означает вставку другого UIImageView над изображением вашей фотографии в иерархию представлений.

6

в настоящее время эта работа должным образом применять прямо в UIImageView слой

// 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]; 

взять его here

+1

Заметили, что это должно быть: gradient.frame = imageView.bounds. – chinjazz

+0

Может ли кто-нибудь перевести это на Swift? –

0

Переведенный Свифта:

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

СВИФТ 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

этот код ничего не сделал на моем изображенииПросмотр ... любая идея почему? –

+0

.cg Цвет отсутствует на цвет начала и конца. CAGradientLayer принимает только CGColors, а не UIColors –

Смежные вопросы