Анимация CALayer [фильтры, составной фильтр, задний фильтр] - PullRequest
0 голосов
/ 14 февраля 2020

Мне нужно анимировать один из [filters ,positionFilter, backFilters] на CALayer в композиции видео. Я попробовал следующий код на уровне NSView, чтобы проверить, работает ли код в первую очередь

    view.wantsLayer = true
    view.layerUsesCoreImageFilters = true
    if let filter = CIFilter.init(name: "CIGaussianBlur", parameters: ["inputRadius": 50])  {
        let animation = CABasicAnimation.init(keyPath: "filters")


        animation.isRemovedOnCompletion = false
        animation.fillMode = .forwards

        animation.duration = 2 //for testing

        animation.autoreverses = false

        animation.fromValue = NSArray.init(array: [])
        animation.toValue = NSArray.init(array: [filter])

        view.layer.add(animation, forKey: "CIGaussianBlurAnimation")
    }

, но ничего не происходит, поэтому мне нужно знать, как правильно анимировать одно / все свойства [filters, составFilter, backFilters] CALayer, и поддерживается ли он в AVVideoComposition (в iOS ', я знаю, что это не так поддерживается на iOS UIView CALayers ')

1 Ответ

0 голосов
/ 14 февраля 2020

Я нашел 1/2 решения, НО главный вопрос остается: "Есть ли способ включить CIFilter на CALayer в композиции видео на iOS"

, указанной в документации, чтобы обновить любой Атрибут фильтра после применения к слою, вы должны использовать

layer.setValue(1, forKeyPath: "backgroundFilters.myFilter.inputRadius")

Так что это означает, что для анимации любого фильтра, мы должны обновить свойства фильтра непосредственно в анимации, поэтому следует сделать следующее

для compositingFilter свойство:

let animation = CABasicAnimation(keyPath: "compositingFilter.inputRadius")

и для фильтра в filters свойство:

filter.name = "filterName"
layer.filters = [someFilters, filter, otherFilters]
let animation = CABasicAnimation(keyPath: "filters.filterName.inputRadius")

и для фильтра в backgroundFilters свойство:

filter.name = "filterName"
layer.backgroundFilters = [someFilters, filter, otherFilters]
let animation = CABasicAnimation(keyPath: "backgroundFilters.filterName.inputRadius")

и задайте свойства animation, затем добавьте его в слой layer.add(animation, forKey: "animationKey")

ПРИМЕЧАНИЕ: animationKey может быть любым значением, даже значением nil, но с повторным использованием значение удалит предыдущую анимацию; даже когда работает

...