Как исправить «Возможности оптимизации»

#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 снова и снова отображать тень при изменении кадра представления. Но при первом рендеринге тень по-прежнему отображается динамически, что дорого. Короче говоря, растеризация действительно оптимизирует производительность в некоторых случаях использования, но представление все еще имеет возможности для дальнейшей оптимизации.