Можно ли добавить эффект свечения к тексту, избегая при этом большого снижения производительности?

У меня есть текст, к которому нужно добавить свечение. Дело в том, что при добавлении эффекта свечения я получаю удар по производительности.

У меня есть несколько анимаций (они происходят только по одной и не представляют собой ничего особенного или сложного). Это анимации, такие как изменение значений альфа-канала и масштаба UIView.

Они идеально гладкие! Однако при добавлении свечения с помощью Quartz Core к тексту, который у меня есть на экране, остальная анимация перестает быть такой плавной.

На папином iPhone 3GS они прекрасно работают! Однако на моем iPhone 4 они работают медленно! Документация предупреждает о дисплее сетчатки из-за того, что у него в 4 раза больше пикселей. Но мне очень нужен этот эффект свечения!

// This work good!
    _timerLabel.shadowColor  = [UIColor darkGrayColor];
    _timerLabel.shadowOffset = CGSizeMake(0.0, 0.5);
    _timerLabel.alpha        = 1.0;

// This gets me a performance hit
_timerLabel.layer.shadowRadius  = 3;
_timerLabel.layer.shadowOpacity = 0.3;

В любом случае я могу сделать это, не влияя на производительность?

ИЗМЕНИТЬ

// This does help some! But it's not there yet.. It still has a heavy FPS loss
_timerLabel.layer.shouldRasterize = YES;

Благодарю вас!


person nmdias    schedule 11.08.2013    source источник
comment
Это зависит именно от того, как вы пытаетесь его использовать. Некоторые плохие приемы заключаются в том, чтобы иметь второй шрифт, который выглядит как эффект свечения, и накладывать текст, но это может быть не очень гибким или выглядеть очень красиво.   -  person bengoesboom    schedule 12.08.2013
comment
Уже думал пойти по этому пути! Но это было слишком грязно для эффекта свечения.   -  person nmdias    schedule 12.08.2013
comment
Эффекты свечения/тени стоят дорого, здесь нет двух способов обойти это. Я думаю, вряд ли вы найдете лучший способ сделать это; если это так, то, вероятно, это должен быть openGL непосредственно на видеокарте, и если вам нужно спросить, вы не сможете сделать это лучше, чем Quartz2d.   -  person Kevin    schedule 12.08.2013


Ответы (2)


Убедитесь, что вы установили shadowPath вот так

[myView.layer setShadowPath:[[UIBezierPath 
bezierPathWithRect:myView.bounds] CGPath]];

Ссылка: О важности установки shadowPath

person user1459524    schedule 12.08.2013

Свифт 4

Светящаяся анимация с небольшим снижением производительности. Допустим, у вас есть UILabel или UITextField, содержащий ваш текст.

1- Создайте расширение UIView с анимацией

2- Используйте его для текстовых полей, кнопок, представлений (любой подкласс UIView)

Расширение UIView

import UIKit

extension UIView{
    enum GlowEffect:Float{
        case small = 0.4, normal = 1, big = 5
    }

    func doGlowAnimation(withColor color:UIColor, withEffect effect:GlowEffect = .normal) {
        layer.masksToBounds = false
        layer.shadowColor = color.cgColor
        layer.shadowRadius = 0
        layer.shadowOpacity = effect.rawValue
        layer.shadowOffset = .zero

        let glowAnimation = CABasicAnimation(keyPath: "shadowRadius")
        glowAnimation.fromValue = 0
        glowAnimation.toValue = 1
        glowAnimation.beginTime = CACurrentMediaTime()+0.3
        glowAnimation.duration = CFTimeInterval(0.3)
        glowAnimation.fillMode = kCAFillModeRemoved
        glowAnimation.autoreverses = true
        glowAnimation.isRemovedOnCompletion = true
        layer.add(glowAnimation, forKey: "shadowGlowingAnimation")
    }
}

Как использовать его на UILabels и Textfields:

//TextField with border
textField.doGlowAnimation(withColor: UIColor.red, withEffect: .big)

//Label
label.doGlowAnimation(withColor: label.textColor, withEffect: .small)
person alegelos    schedule 06.06.2018