iOS10 + Gradient перестает работать

Только что был перенесен на Xcode8 и iOS10, обеспечивая поддержку iOS10 для одного из приложений.

Выясните странную проблему, вдруг градиент не работает.

Я обнаружил, что после применения раскадровки (изменения раскадровки в Xcode8) изменяется градиент, невидимый для представлений.

Xcode 7.3 — градиентные представления —

введите описание изображения здесь

Xcode 8 — градиентные представления —

введите описание изображения здесь

Кроме того, если я заменю раскадровку старой раскадровкой, она покажет градиент, поэтому с новой раскадровкой что-то не так.

В коде нет изменений:

[view setOpaque:NO];
view.layer.cornerRadius = 45;
view.backgroundColor = [UIColor colorWithRed:23.0/255.0 green:29.0/255.0 blue:36.0/255.0 alpha:1.0];

CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = view.bounds;

UIColor *color1 = [UIColor colorWithRed:33.0/255.0 green:39.0/255.0 blue:46.0/255.0 alpha:1.0];
UIColor *color2 = [UIColor colorWithRed:23.0/255.0 green:29.0/255.0 blue:36.0/255.0 alpha:1.0];
UIColor *color3 = [UIColor colorWithRed:14.0/255.0 green:20.0/255.0 blue:26.0/255.0 alpha:1.0];

NSArray *colorsArray = @[(id)color1.CGColor, (id)color2.CGColor, (id)color3.CGColor];

gradient.colors = colorsArray;
[gradient setLocations:@[@0.0, @0.35]];
[view.layer insertSublayer:gradient atIndex:0];

Дайте мне знать, если кто-нибудь понял это.

Изменить:

Я не создавал новую раскадровку, я просто применил ниже изменения, предложенные Xcode8.

введите описание изображения здесь


person Kampai    schedule 20.10.2016    source источник
comment
Кроме того, если я заменю раскадровку старой раскадровкой, она покажет градиент. Тогда в раскадровках есть какая-то существенная разница. Сравните их и найдите. Или используйте старую раскадровку. (Зачем ты сделал новый?)   -  person matt    schedule 20.10.2016
comment
Ваш код в порядке. Запустите под отладчиком и убедитесь, что представление не nil, и вы действительно применяете градиент. Установите фон в раскадровке на что-то другое, например пурпурный.   -  person paiv    schedule 20.10.2016
comment
@matt - Если приложение создано с помощью Xcode 7.x и мы открываем его в Xcode8, оно вносит изменения в старую раскадровку, как бы то ни было, открывается в Xcode 7.x. Но это не позволит мне открыть раскадровку таким образом, она всегда меняет ее на новую. Не создана новая раскадровка, она такая же   -  person Kampai    schedule 20.10.2016
comment
Какие изменения? Мне не пришлось создавать новую раскадровку ни для одного из моих приложений, когда я обновился до Xcode 8.   -  person matt    schedule 20.10.2016
comment
@matt: Пожалуйста, проверьте отредактированный вопрос   -  person Kampai    schedule 20.10.2016
comment
Хорошо, я понял, и я понял проблему!   -  person matt    schedule 20.10.2016
comment
Если вы хотите ответить в swift 3, ios 10, я отправлю его @Kampai   -  person Jitendra Modi    schedule 20.10.2016
comment
@Jecky: Нет, не сейчас. в любом случае спасибо   -  person Kampai    schedule 20.10.2016


Ответы (1)


Проблема в том, что произошло изменение сроков верстки. Поэтому ваш код запускается слишком рано. Ты говоришь

gradient.frame = view.bounds

Но на данный момент у представления нулевые границы. Итак, градиент имеет нулевую рамку! Вот почему вы не можете этого видеть. Вы делаете код макета в viewDidLoad. Это всегда было неправильно, и теперь вы понимаете, почему.

Переместите свой код в viewDidLayoutSubviews. В это время взгляд имеет свои реальные границы. Вам нужно будет использовать условие, чтобы ваш код запускался только один раз.

person matt    schedule 20.10.2016
comment
Ах да, я забыл о кадрах!!!!!....теперь все работает. Спасибо друг :) - person Kampai; 20.10.2016
comment
Мне было интересно, почему это работало раньше в Xcode7.x, код был в viewDidLoad() и работал для iOS7, iOS8 и iOS9. - person Kampai; 20.10.2016
comment
Как я уже сказал: произошли изменения в сроках макета. Раньше вам повезло со временем, но вы делали предположение, которое не обязательно было правдой. viewDidLoad не является сигналом того, что кадры были применены. viewDidLayoutSubviews есть. - person matt; 20.10.2016
comment
Да, еще раз спасибо. Принято к сведению - person Kampai; 20.10.2016