Тень отстает от пользовательского интерфейса
У меня есть около 15 видов, для которых я применяю тень QuartzCore следующим образом:
for button in buttonsArray {
button.layer.shadowOpacity = 0.75
button.layer.shadowColor = UIColor.blackColor().CGColor
button.layer.shadowRadius = 2.0
button.layer.shadowOffset = CGSize(width: 0.4, height: 1.2)
}
Когда у меня много этой тени в 1 виде (как в этом примере), она действительно начинает замедляться и отставать от пользовательского интерфейса.
Как я могу это исправить, или какие у меня есть альтернативы? Спасибо!
2 ответа
Посмотрите видео WWDC 2014 "Расширенная графика и анимация для приложений iOS".
https://developer.apple.com/videos/wwdc/2014/
35:50 в... говорится о том, почему использование такого типа кода для генерации тени приводит к дополнительным закадровым проходам для графического процессора, когда он вычисляет форму тени.
Предлагаемое решение заключается также в использовании shadowPath
свойство на слое, если вы уже знаете форму тени...
Это отличное видео для просмотра.
В зависимости от того, как выглядят ваши кнопки, одной из идей будет использование фонового изображения для кнопок, содержащих тень, вместо добавления тени в коде. Вы также можете использовать resizableImageWithCapInsets
сделать для различных возможных размеров ваших кнопок.
UIImage* image = [UIImage imageNamed:@"button.png"];
UIEdgeInsets insets = UIEdgeInsetsMake(16, 6, 16, 6); // change the insets to fit your needs
image = [image resizableImageWithCapInsets:insets];
[button setBackgroundImage:image forState:UIControlStateNormal];
Документацию по re sizableImageWithCapInsets можно найти по адресу https://developer.apple.com/library/ios/documentation/uikit/reference/uiimage_class/index.html:
Это решение может не подойти вам, в зависимости от того, как выглядят ваши кнопки. Но использование изображений вместо добавления тени от кода должно ускорить ваш код.