【发布时间】:2021-10-16 23:00:57
【问题描述】:
我创建了一个自定义 CIFilter 并使用类 func registerName 方法将其注册到 CIFilter 类中。自定义过滤器已创建并按预期工作。 但是 CIFilter 不回答注册的 kCIAttributeDescription。
CIFilter.localizedDescription(forFilterName: ciFilterName) 不回答 registerName 方法中使用的字符串。 如果自定义过滤器实际被实例化,它确实包含属性描述。
系统中的所有 Apple 过滤器都会在不创建过滤器的情况下回答本地化描述。用户获取有关过滤器的信息以帮助选择过滤器。
自定义过滤器如何实现相同的行为?
这是注册码
CIFilter.registerName(kPRandom, constructor: PGLFilterConstructor(),
classAttributes: [
kCIAttributeFilterDisplayName : "Random Filters",
kCIAttributeFilterCategories :
[ kCICategoryStillImage,
kCICategoryTransition],
kCIAttributeDescription : "Swipe on stack Make command to add random filters to the stack. Select photos for random input with Parms Pick command"
]
)
p.s 自定义过滤器用于 App Store 上的 iPad“Wills Filter Tool”应用程序。探索过滤器的世界非常棒,因此随机过滤器生成器被证明是应用过滤器的一个很好的学习和实验工具。
p.p.s 演示问题的 Swift Playground
import UIKit
import CoreImage
// demonstrates that registering a custom filter does
// not register the kCIAttributeDescription
let kPRandom = "Random Filters"
let kCIDissolveFilter = "CIDissolveTransition"
class PGLFilterConstructor: CIFilterConstructor {
//MARK: CIFilterConstructor protocol
func filter(withName: String) -> CIFilter? {
return CIFilter(name: withName)
}
}
class PGLRandomFilterAction: CIFilter {
// filter that answers the input as the outputImage
// a pass thru filter
@objc dynamic var inputImage: CIImage?
class func register() {
CIFilter.registerName(kPRandom, constructor: PGLFilterConstructor(), classAttributes:
[
kCIAttributeFilterDisplayName : "Random Filters",
kCIAttributeFilterCategories :
[ kCICategoryStillImage,
kCICategoryTransition],
kCIAttributeDescription : "Swipe on stack Make command to add random filters to the stack. Select photos for random input with Parms Pick command"
]
)
}
override var outputImage: CIImage? {
get {
return inputImage }
}
}
PGLRandomFilterAction.register()
// added to CIFilter
let randomDescription = CIFilter.localizedDescription(forFilterName: kPRandom)
let dissolveDescription = CIFilter.localizedDescription(forFilterName: kCIDissolveFilter)
// randomDescription contains the filter name. Should be the string
// set in the kCIAttributeDescription line
// dissolveDescription contains the expected description
【问题讨论】:
-
我不禁注意到您的 PGLFilterConstructor 不是 Objective-C 内省的。它不是 NSObject 的后代,它的
filter(withName:)没有标记为@objc。会不会是这个问题?