SwiftUIのblurはどのように実現されているのか調査

Updated
Apr 25, 2020 7:45 PM
Created
Apr 25, 2020 6:53 PM
Tags
SwiftSwiftUI
Keywords
Date

SwiftUIではコンポーネントにblurをかけることが簡単になっている。

これはUIKitではできないものかと。

CALayerには古くからfilterというプロパティがある (たしかmacOSではCIFilterが使えたんだっけ?)

iOSではCAFilterというオブジェクトが利用されているようだがそれはprivate-api

しかし、SwiftUIでblurや明るさ調整など、明らかにフィルターが担当することを呼び出せること、そして、それらをUIKitとCoreAnimationという資産の上で基本は成り立っているSwiftUIということからCALayer.filtersが使われていると推測。

RevealでBlurをかけたコンポーネントのアドレスを取得し、LLDBから覗いてみる。

(lldb) po [(CALayer*)0x600003cb0cc0 filters]
<Swift.__SwiftDeferredNSArray 0x600003cb0d00>(
colorBrightness,
gaussianBlur
)

やはり。

(lldb) expr -T -d run-target -- [(CALayer*)0x600003cb0cc0 filters][0]
(CAFilter *) $12 = 0x00006000032a1ad0

そして、中身はやはりCAFilter

CoreAnimationに隠れているPrivateAPIを使ってみたという記事

runtime-header

例は雑だけど、適当に呼んでみたら確かに動いた

image

TimOliverさんがこのあたりのAPIを利用したOSSを作っていた