#swift #xcode #debugging #uiview
#swift #xcode #отладка #uiview
Вопрос:
Я использую xcode 12. Я написал представление пользовательского интерфейса расширения, как показано ниже:
@IBInspectable
public var shadowRadius: CGFloat {
get {
return layer.shadowRadius
}
set {
layer.shadowRadius = newValue
}
}
@IBInspectable
public var shadowOpacity: Float {
get {
return layer.shadowOpacity
}
set {
layer.shadowOpacity = newValue
}
}
@IBInspectable
public var shadowOffset: CGSize {
get {
layer.shadowOffset
}
set {
layer.shadowOffset = newValue
}
}
@IBInspectable
public var shadowColor: UIColor {
get {
return UIColor(cgColor: layer.shadowColor ?? UIColor.clear.cgColor)
}
set {
layer.shadowColor = newValue.cgColor
}
}
Все работает нормально, но когда я отлаживаю view, я видел несколько фиолетовых предупреждений, подобных этому.
x-xcode-debug-views://7f8fd2258020?DBGViewDebuggerLaunchSessionParameter=7f8fd2258020: время выполнения: Возможности оптимизации: слой использует динамические тени, которые дорого отображать. Если возможно, попробуйте настроить
shadowPath
или предварительно отобразить тень на изображении и поместить ее под слой.
Может кто-нибудь объяснить мне это и помочь мне избавиться от этого??
Комментарии:
1. Спасибо за вопрос, у меня тоже такой же вопрос, но как мы узнаем, над каким слоем работать? в сообщении об ошибке нет никаких указаний
2. @StackGU во время запуска приложения откройте иерархию представлений отладки. На левой панели вы увидите фиолетовый восклицательный знак рядом с представлением (и его родителями) с проблемой.
Ответ №1:
Настройка shadowPath
Одним из решений является «направлять» теневой рендеринг shadowPath
, явно настраивая его в соответствии с вашими потребностями, например.:
yourViewWithShadow.layer.shadowPath = UIBezierPath(rect: yourViewWithShadow.bounds).cgPath
Убедитесь, что вы устанавливаете фрейм в нужное время!
Растеризация кэша
Другим решением является кэширование растеризации:
yourViewWithShadow.layer.shouldRasterize = true
yourViewWithShadow.layer.rasterizationScale = UIScreen.main.scale
Надеюсь, это поможет вам избавиться от дорогостоящих вычислений.
Комментарии:
1. Спасибо. Я попытался установить shadowPath, и тень больше не появляется. Затем я попробовал опцию растеризации кэша, и пока тень снова отображается, появляется предупреждение о возможности оптимизации.
2. Включение растеризации не решает эту проблему.
3. Растеризация не позволит UIKit снова и снова отображать тень при изменении кадра представления. Но при первом рендеринге тень по-прежнему отображается динамически, что дорого. Короче говоря, растеризация действительно оптимизирует производительность в некоторых случаях использования, но представление все еще имеет возможности для дальнейшей оптимизации.