'WKWebView swift: manipulating view's layer using CIFilter
I've coded a fisheye or "barrel distortion" transformation CIFilter, and would like to apply it to a WKWebView, with some lengthy metal file to metallib file build rule preparations taken from the following tutorial
https://www.raywenderlich.com/25658084-core-image-tutorial-for-ios-custom-filters
I've created a shader I called fisheye.ci.layer and its swift CIFilter subclass FisheyeFilter as per below:
import Foundation
import CoreImage
class FisheyeFilter: CIFilter {
@objc dynamic var inputImage: CIImage?
static var kernel: CIKernel = { () -> CIWarpKernel in
guard let url = Bundle.main.url(
forResource: "fisheye.ci",
withExtension: "metallib"),
let data = try? Data(contentsOf: url) else {
fatalError("Unable to load metallib")
}
guard let kernel = try? CIWarpKernel(
functionName: "fisheye",
fromMetalLibraryData: data) else {
fatalError("Unable to create fisheye kernel")
}
return kernel
}()
override class var supportsSecureCoding: Bool {
return true
}
override var outputImage: CIImage? {
guard let inputImage = inputImage else { return nil }
return FisheyeFilter.kernel.apply(
extent: inputImage.extent,
roiCallback: { _, rect in
return rect
},
arguments: [inputImage])
}
}
I've created a custom NSRepresentable object to allow my WKWebView to be used in a swiftUI environment, and it works perfectly well.
Now I'm trying to add the custom CIFilter on the WKWebView's layer, using the code snippet below in my NSRepresentable protocol method:
// Transform the webView with fisheye
webView.wantsLayer = true
webView.layerUsesCoreImageFilters = true
let filter = FisheyeFilter()
filter.name = "fisheye"
webView.contentFilters = [filter]
return webView
Nothing happens though,m and I'm wondering if I actually need to take a snapshot at every update of the WKWebView's layer, then render on a subView, using the layer or if I'm missing something.
note: the app will crash with an NSException with key/value coding not being respected or not recognising the input image if everything was not set properly. In this case, it's running fine, but without the filter being applied.
Any help greatly appreciated
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
