Слой градиента не отображается / не работает в существующем представлении - PullRequest
1 голос
/ 18 июля 2010

У меня есть представление с другим представлением (называемым swipeView) внутри.Я пытаюсь градиентный цвет, используя CAGradientLayer - код ниже

CAGradientLayer *layer = [CAGradientLayer layer];

layer.colors = [NSArray arrayWithObjects:(id)[UIColor darkGrayColor].CGColor, 
                  [UIColor lightGrayColor].CGColor, nil];

layer.frame = swipeView.bounds;

[swipeView.layer insertSublayer:layer atIndex:0];

Я вызываю это в методе ViewDidLoad контроллера основного представления.Я не вижу эффекта - вид, который я пытаюсь раскрасить, остается прежним.Что я делаю неправильно?Есть ли какие-либо другие настройки / порядок и т. Д., О которых я должен знать?

Ответы [ 4 ]

3 голосов
/ 12 декабря 2012

Я не знаю, является ли это вашей проблемой, но у меня был точно такой же симптом, и после нескольких часов недоумения я обнаружил свою проблему: я создавал кнопку, добавляя градиентслой, и только позже позиционирование кнопки.Изначально размеры кнопок были равны 0, а при настройке layer.frame = swipeView.bounds; я также устанавливал для слоя градиента значение 0.Я добавил код, чтобы при определении размера кнопки я также подбирал подслои по размеру, чтобы соответствовать, и это решило проблему.Я на самом деле использую MonoTouch, поэтому код выглядит следующим образом:

btn.Frame = new RectangleF([the dimensions you need]);

foreach(var s in btn.Layer.Sublayers)
{
   s.Frame = btn.Bounds;
}

Возможно, вы создаете представление в коде, и представление не было масштабировано или позиционировано, и поэтому при добавленииградиент также не имеет размера, и поэтому вы не можете его видеть.Когда представление изменит размер (возможно, в ViewDidLayoutSubviews), измените размер слоя градиента и посмотрите, решит ли это его.

0 голосов
/ 18 апреля 2016

Вам не нужен терминатор nil в конце массива цветов.

Кроме того, я обнаружил, что insertSublayer не работает, с индексом либо 0, либо 1. Изменение на просто addSublayer помогло.

0 голосов
/ 24 января 2012
CAGradientLayer *layer = [CAGradientLayer layer];

layer.colors = [NSArray arrayWithObjects:(id)[UIColor darkGrayColor].CGColor, 
              (id)[UIColor lightGrayColor].CGColor, nil];

layer.frame = swipeView.bounds;

[swipeView.layer insertSublayer:layer atIndex:0];

Убедитесь, что swipeView не равен nil, и попробуйте swipeView.frame.

0 голосов
/ 29 июля 2010

Это должно работать.Вы уверены, что правильно подключили розетку swipeView?Отладьте ваш -viewDidLoad и убедитесь, что swipeView не ноль.Также дважды проверьте, что границы (layer.frame) являются чем-то разумным.

Это не должно быть необходимым, но вы можете попробовать добавить [layer setNeedsDisplay] только для того, чтобы заставить слой рендериться снова, но я нене думаю, что это ваша проблема здесь.

...