Если есть какой - либо другие виды , добавленные на это UIView(например , как UILabel), вы можете рассмотреть вопрос о создании цвета фона тех UIView«S , чтобы [UIColor clearColor]таким образом вид градиента представлен вместо цвета фона для представлений подразделов. Использование clearColorимеет небольшой удар по производительности.
+1 за наименьшее количество кода из всех решений. Я только добавил к своему существующему контроллеру представления, изменил 2 ссылки viewна, self.viewи это работало как очарование :)
Это мне очень помогло! Пропустил CGColor часть везде! Спасибо
Gyfis
48
Не забудьте использовать «startPoint» и «endPoint» для изменения направления градиента. Значения по умолчанию: (0,5, 0) и (0,5,1) - сверху вниз.
Валентин Шамардин
12
Когда мой UIView использует AutoLayout, я также должен был позвонить gradient.frame = view.boundsв viewDidAppear()и didRotateFromInterfaceOrientation()или иначе градиент не будет выбран надлежащим образом .
EricRobertBrewer
70
Вы можете создать собственный класс GradientView :
Привет @LaloLoop, спасибо за комментарий! Я обновил код. Я не думаю, что я должен переопределить, init(frame:CGRect)хотя. Я проверил обновленный код, и он отлично работает.
Юйчен Чжун
@Yuchen Zhong Это сбой в IB, но работает в приложении. Какие-то причины, почему он не отображается в IB, если @IBDesignableиспользуется?
Александр Волков
@AlexanderVolkov Возможно, какой-то другой вопрос? Мы использовали это как в раскадровке, и, похоже, у нас нет проблем. Вы можете отладить свою раскадровку и посмотреть, какая строка ее сбивает.
Чтобы продвигать возможность повторного использования, я бы сказал, создайте категорию CAGradientLayerи добавьте желаемые градиенты в качестве методов класса. Укажите их в headerфайле следующим образом:
где вы должны поместить код для его использования? какой метод жизненного цикла? viewdidappear заставляет его появиться на секунду позже. viewdidload и viewdidappear приводят к тому, что он не работает во время вращения. viewdidlayoutsubviews лучше работает для вращения, но все равно выглядит немного изменчиво.
Адам Джонс
Я лично положил этоviewDidLoad
Сэм Фишер
1
Когда я вставил его viewDidLoad, он не работал, если приложение было запущено в горизонтальной ориентации. Моим решением было сделать рамку фонового слоя шире, чем view.frame, чтобы компенсировать другие ориентации.
Адам Джонс
2
viewDidLoad работает, вам просто нужно также установить AutoResizingMask, используя [backgroundLayer setAutoresizingMask: UIViewAutoresizingF FlexibleWidth | UIViewAutoresizingF FlexibleHeight];
ekscrypto
21
Поскольку во всем приложении мне был нужен только один тип градиента, я создал подкласс UIView и предварительно настроил слой градиента при инициализации с фиксированными цветами. Инициализаторы UIView вызывают метод configureGradientLayer , который настраивает CAGradientLayer:
#import "DDGradientView.h"@implementationDDGradientView// Change the views layer class to CAGradientLayer class+(Class)layerClass
{return[CAGradientLayerclass];}-(instancetype)initWithCoder:(NSCoder*)aDecoder {self=[super initWithCoder:aDecoder];if(self){[self configureGradientLayer];}returnself;}-(instancetype)initWithFrame:(CGRect)frame {self=[super initWithFrame:frame];if(self){[self configureGradientLayer];}returnself;}// Make custom configuration of your gradient here -(void)configureGradientLayer {CAGradientLayer*gLayer =(CAGradientLayer*)self.layer;
gLayer.colors =[NSArray arrayWithObjects:(id)[[UIColor whiteColor]CGColor],(id)[[UIColor lightGrayColor]CGColor],nil];}@end
Вызов Swift3 должен выглядеть следующим образом: myImageView.addGradientWithColor (color: UIColor.blue)
mgyky
8
Быстрый подход
Этот ответ основан на ответах выше и обеспечивает реализацию для решения проблемы неправильного применения градиента во время вращения. Это решает эту проблему, изменяя градиентный слой на квадрат, так что вращение во всех направлениях приводит к правильному градиенту. Сигнатура функции включает в себя переменный аргумент Swift, который позволяет передавать столько CGColorRef (CGColor), сколько необходимо (см. Пример использования). Также предоставлен пример в качестве расширения Swift, так что можно применить градиент к любому UIView.
Это означает, что теперь градиентный фон может быть применен к любому UIControl, поскольку все элементы управления являются UIViews (или подклассом), и все UIViews имеют CALayers.
То, что вы ищете, это CAGradientLayer. У каждого UIViewесть слой - в этот слой вы можете добавить подслои так же, как вы можете добавить подпредставления. Один конкретный тип - это CAGradientLayer, где вы задаете массив цветов для градиента.
Одним из примеров является эта простая оболочка для градиентного вида:
Мое решение состоит в том, чтобы создать UIViewподкласс с CAGradientLayerдоступным как свойство только для чтения. Это позволит вам настроить свой градиент так, как вы хотите, и вам не нужно обрабатывать изменения макета самостоятельно. Реализация подкласса:
Я использовал этот подход, меняя topview на имя моего IBoutlet для моего просмотра. Я удалил строку "SearchView".
Джесси
Хороший план - возможно, также обратите внимание, что вы можете использовать любую из настроек градиента. Таким образом, если вы закомментируете простой градиент .colors с использованием именованных цветов пользовательского интерфейса, изображение будет таким же, но если вы закомментируете другой, тогда градиент цвета зависит от красного на зеленый. Пользователи могут сделать любой.
Ответы:
Objective-C:
Swift:
Информация : используйте startPoint и endPoint, чтобы изменить направление градиента .
Если есть какой - либо другие виды , добавленные на это
UIView
(например , какUILabel
), вы можете рассмотреть вопрос о создании цвета фона техUIView
«S , чтобы[UIColor clearColor]
таким образом вид градиента представлен вместо цвета фона для представлений подразделов. ИспользованиеclearColor
имеет небольшой удар по производительности.источник
view
на,self.view
и это работало как очарование :)gradient.frame = view.bounds
вviewDidAppear()
иdidRotateFromInterfaceOrientation()
или иначе градиент не будет выбран надлежащим образом .Вы можете создать собственный класс
GradientView
:Swift 5
В раскадровке установите тип класса для любого представления, для которого вы хотите иметь градиентный фон:
Это лучше следующими способами:
CLayer
NSConstraint
как обычно наUIView
источник
layerClass
функция больше не является функцией, это свойство, поэтому вы должны переопределить его как свойство: stackoverflow.com/questions/28786597/… . Также вы должны реализоватьoverride init(frame: CGRect)
, проверьте этот ответ: stackoverflow.com/questions/27374330/… . Спасибо!init(frame:CGRect)
хотя. Я проверил обновленный код, и он отлично работает.@IBDesignable
используется?Попробуйте, это сработало для меня
Цель С
Я установил цвет градиента RGB для UIview
ОБНОВЛЕНО: - Swift3 +
Код : -
Вы можете добавить начальную и конечную точку цвета градиента.
Для более подробной информации см. CAGradientLayer Doc
Надеюсь, что это помощь для кого-то.
источник
Это мой рекомендуемый подход.
Чтобы продвигать возможность повторного использования, я бы сказал, создайте категорию
CAGradientLayer
и добавьте желаемые градиенты в качестве методов класса. Укажите их вheader
файле следующим образом:Затем в вашем файле реализации укажите каждый градиент с этим синтаксисом:
Затем просто импортируйте эту категорию в свой
ViewController
или любой другой необходимыйsubclass
и используйте его следующим образом:источник
viewDidLoad
viewDidLoad
, он не работал, если приложение было запущено в горизонтальной ориентации. Моим решением было сделать рамку фонового слоя шире, чем view.frame, чтобы компенсировать другие ориентации.Поскольку во всем приложении мне был нужен только один тип градиента, я создал подкласс UIView и предварительно настроил слой градиента при инициализации с фиксированными цветами. Инициализаторы UIView вызывают метод configureGradientLayer , который настраивает CAGradientLayer:
DDGradientView.h:
DDGradientView.m:
источник
initGradientLayer
похоже на инициализатор. Я не думаю, что это очень подходит.Быстрая реализация:
источник
Я немного расширил принятый ответ, используя функциональность расширения Swift, а также перечисление.
Да , и если вы используете раскадровки , как я, не забудьте позвонить
gradientBackground(from:to:direction:)
вviewDidLayoutSubviews()
или позже.Свифт 3
источник
Я реализовал это в быстрой с расширением:
Свифт 3
Swift 2.2
Нет, я могу установить градиент для каждого вида, как это:
источник
Быстрый подход
Этот ответ основан на ответах выше и обеспечивает реализацию для решения проблемы неправильного применения градиента во время вращения. Это решает эту проблему, изменяя градиентный слой на квадрат, так что вращение во всех направлениях приводит к правильному градиенту. Сигнатура функции включает в себя переменный аргумент Swift, который позволяет передавать столько CGColorRef (CGColor), сколько необходимо (см. Пример использования). Также предоставлен пример в качестве расширения Swift, так что можно применить градиент к любому UIView.
Использовать:
в viewDidLoad ...
Расширение реализации
Пример варианта использования расширения:
Это означает, что теперь градиентный фон может быть применен к любому UIControl, поскольку все элементы управления являются UIViews (или подклассом), и все UIViews имеют CALayers.
Swift 4
Расширение реализации
Пример варианта использования расширения:
источник
То, что вы ищете, это
CAGradientLayer
. У каждогоUIView
есть слой - в этот слой вы можете добавить подслои так же, как вы можете добавить подпредставления. Один конкретный тип - этоCAGradientLayer
, где вы задаете массив цветов для градиента.Одним из примеров является эта простая оболочка для градиентного вида:
http://oleb.net/blog/2010/04/obgradientview-a-simple-uiview-wrapper-for-cagradientlayer/
Обратите внимание, что вам нужно включить платформу QuartZCore, чтобы получить доступ ко всем частям слоя UIView.
источник
Свифт 4:
Показывает градиент в IB правильно:
источник
ИСПОЛЬЗОВАНИЕ
источник
Простой быстрый просмотр на основе версии Ючена
Затем вы можете использовать градиентный слой после инициализации, как это ...
источник
Мое решение состоит в том, чтобы создать
UIView
подкласс сCAGradientLayer
доступным как свойство только для чтения. Это позволит вам настроить свой градиент так, как вы хотите, и вам не нужно обрабатывать изменения макета самостоятельно. Реализация подкласса:Использование:
источник
Это хорошая идея, чтобы вызвать решения выше, чтобы обновить слой на
чтобы правильно обновлять представления
источник
SWIFT 3
Чтобы добавить градиентный слой на ваш вид
Привязать свою точку зрения
Определите CAGradientLayer ()
Вот код, который вы должны написать в вашем viewDidLoad
YOURVIEW.layoutIfNeeded()
gradient.startPoint = CGPoint(x: CGFloat(0), y: CGFloat(1)) gradient.endPoint = CGPoint(x: CGFloat(1), y: CGFloat(0)) gradient.frame = YOURVIEW.bounds gradient.colors = [UIColor.red.cgColor, UIColor.green.cgColor] gradient.colors = [ UIColor(red: 255.0/255.0, green: 56.0/255.0, blue: 224.0/255.0, alpha: 1.0).cgColor,UIColor(red: 86.0/255.0, green: 13.0/255.0, blue: 232.0/255.0, alpha: 1.0).cgColor,UIColor(red: 16.0/255.0, green: 173.0/255.0, blue: 245.0/255.0, alpha: 1.0).cgColor] gradient.locations = [0.0 ,0.6 ,1.0] YOURVIEW.layer.insertSublayer(gradient, at: 0)
источник
В Swift 3.1 я добавил это расширение в UIView
с которым я потом позвоню
источник
Я реализовал это в своем коде.
Теперь я вижу градиент на моем видении.
источник
Чтобы придать цвет градиента UIView (Swift 4.2)
Как пользоваться
источник