Ответ 1
Вы должны ожидать замедление от добавления тени. A shadowRadius
20 очень высок и будет особенно медленным.
Другой ключ для улучшения скорости рендеринга тени: установите свойство shadowPath
. Это может значительно помочь.
Итак, я делаю некоторые пользовательские анимации на моем навигационном контроллере и то, как он толкает и всплывает viewControllers.
Все работает ровно. Как только я добавлю следующий код (в подклассе UINavigationController
), я столкнулся с огромным успехом. После добавления тени все анимации становятся очень лагированными. Ожидается ли это, или я делаю что-то неправильно в коде?
// This code gets called once during NavigationController initialization.
[self.view setClipsToBounds:NO];
[self.view.layer setCornerRadius:5];
[self.view.layer setShadowOffset:CGSizeMake(0, 20)];
[self.view.layer setShadowColor:[[UIColor yellowColor] CGColor]];
[self.view.layer setShadowRadius:20.0];
[self.view.layer setShadowOpacity:1];
EDIT:
Изменен радиус тени до 1 и он все еще медленный
Вы должны ожидать замедление от добавления тени. A shadowRadius
20 очень высок и будет особенно медленным.
Другой ключ для улучшения скорости рендеринга тени: установите свойство shadowPath
. Это может значительно помочь.
self.view.layer.shouldRasterize = YES;
self.view.layer.rasterizationScale = UIScreen.mainScreen.scale;
Недавно у меня были проблемы с медленными тенями CALayer, и эта простая строка кода исправила все для меня!
Используя shadowPath
вместо shadowOffset
.
theView.layer.shadowPath = [UIBezierPath bezierPathWithRect:theView.bounds].CGPath;
Отметьте это сообщение: iphone - производительность анимации очень плохая, когда тень представления включена
Да, тень очень дорога (особенно тень, которая играет большую роль с радиусом, и вы заметите, что она имеет огромное значение в степени замедления, которую вы испытываете). Один из способов повысить производительность - это сделать один раз CGImageContext
и просто отобразить это изображение вместо того, чтобы слой повторно отображал тень каждый раз, когда он перерисовывается (но это не работает, если тень нуждается в анимации или что-то еще).