Łukasz Zieliński
05/25/2023, 9:07 AMIvan Matkov
05/25/2023, 9:17 AMŁukasz Zieliński
05/25/2023, 9:33 AMDima Avdeev
05/25/2023, 10:13 AMDima Avdeev
05/25/2023, 10:16 AMComposeUIViewController {
// Your Compose code here
}.apply {
view.backgroundColor = UIColor(white = 0.0, alpha = 0.0)
}
Dima Avdeev
05/25/2023, 11:29 AMrootView.backgroundColor = UIColor(white = 0.5, alpha = 0.5)
Compose library on iOS. But still it draws white background color by default. It is harder to make Compose fully transparent for now. Transparency works only with UIKitView for interoperability.Dima Avdeev
05/25/2023, 11:29 AMJeroen Flietstra
05/25/2023, 11:49 AMJeroen Flietstra
05/25/2023, 11:50 AMSkiaLayer
does not yet support transparancy for iOS:
https://github.com/JetBrains/skiko/blob/53f70be87d2e8664bd8f4ae8c53575e2d2c92fa0/skiko/src/iosMain/kotlin/org/jetbrains/skiko/SkiaLayer.ios.kt#L39Łukasz Zieliński
05/25/2023, 11:58 AMŁukasz Zieliński
05/25/2023, 1:50 PM.apply {
view.alpha = 0.4
}
this works but it changes the entire view.
I also tried to use view.layer.compositingFilter = "multiplyBlendMode" to get rid of white pixels but it seems not to work at all
Jeroen Flietstra
05/25/2023, 10:00 PMINVISIBLE_MEMBER
& INVISIBLE_REFERENCE
warnings (see top).
This will at least display your composable as a UIViewController with a transparent background. Note: there is still some tweaking necessary regarding input & sizing etc. This is just a first step.
Note: CameraOverlay()
is where your composable should go.Jeroen Flietstra
05/25/2023, 10:06 PMSkiaLayer
supports transparency it might already work out of the box for iOS as shown in ContextHandler
:
protected open val clearColor = if (layer.transparency || hostOs == OS.MacOS) 0 else -1
fun draw() {
if (!initContext()) {
throw RenderException("Cannot init graphic context")
}
initCanvas()
canvas?.apply {
clear(if (layer.fullscreen && hostOs != OS.MacOS) -1 else clearColor)
drawContent()
}
flush()
}
which is basically my approach (clear canvas and draw content) which seems to be working fine but lacks all the base logic from the ComposeWindow
UIViewController class. 🙂Łukasz Zieliński
05/26/2023, 2:21 PMŁukasz Zieliński
06/07/2023, 6:23 PMe: Compilation failed: Assertion failed
* Source files:
* Compiler version info: Konan: 1.8.20 / Kotlin: 1.8.20
* Output kind: FRAMEWORK
e: java.lang.AssertionError: Assertion failed
at org.jetbrains.kotlin.backend.konan.llvm.KotlinObjCClassInfoGenerator.generateInstanceMethodDescs(KotlinObjCClassInfoGenerator.kt:83)
...
@file:Suppress(
"INVISIBLE_MEMBER",
"INVISIBLE_REFERENCE",
"FINAL_SUPERTYPE",
"EXPOSED_SUPER_CLASS",
"UNRESOLVED_REFERENCE",
"CANNOT_OVERRIDE_INVISIBLE_MEMBER",
"NOTHING_TO_OVERRIDE",
"ABSTRACT_MEMBER_NOT_IMPLEMENTED",
)
package com.example.test
import androidx.compose.runtime.Composable
import org.jetbrains.skiko.GenericSkikoView
import org.jetbrains.skiko.SkiaLayer
import org.jetbrains.skiko.SkikoView
import platform.UIKit.UIViewController
import androidx.compose.ui.window.ComposeWindow
import androidx.compose.ui.native.ComposeLayer
import org.jetbrains.skia.Canvas
import org.jetbrains.skia.Color
import kotlinx.cinterop.ExportObjCClass
fun MainViewController() =
TransparentViewController {
CameraOverlay()
}
fun TransparentViewController(content: @Composable () -> Unit): UIViewController =
TransparentComposeWindow().apply {
this.content = content // wasn't able to use .setContent()
}
class TransparentComposeWindow : ComposeWindow() {
override lateinit var content: @Composable () -> Unit
override fun loadView() {
super.loadView()
val cl: ComposeLayer = (this as ComposeWindow).layer as ComposeLayer
val skiaLayer: SkiaLayer = cl.layer
val skikoView = GenericSkikoView(skiaLayer, object : SkikoView {
override fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) {
canvas.clear(Color.TRANSPARENT)
cl.scene.render(canvas, nanoTime)
}
})
skiaLayer.skikoView = skikoView // wasn't able to use .addView()
}
}
Jeroen Flietstra
06/07/2023, 7:21 PMJeroen Flietstra
06/07/2023, 7:22 PMJeroen Flietstra
06/07/2023, 7:24 PMŁukasz Zieliński
06/07/2023, 7:52 PMŁukasz Zieliński
09/03/2023, 10:04 PMcanvas.clear(Color.TRANSPARENT)
and
backgroundColor = UIColor.clearColor
opaque = false
Jeroen Flietstra
09/04/2023, 6:58 AMViktor Nyblom
09/24/2023, 11:05 AMerror: Compilation failed: The /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ command returned non-zero exit code: 70.
output:
Global is external, but doesn't have external or weak linkage!
%struct.ObjHeader* (%struct.ObjHeader*, %struct.ObjHeader**)* @"kfun:components.TransparentComposeWindow.object-1.<get-focusManager>#internal"
Global is external, but doesn't have external or weak linkage!
%struct.ObjHeader* (%struct.ObjHeader*, %struct.ObjHeader**)* @"kfun:components.TransparentComposeWindow.object-1.<get-layoutDirection>#internal"
Global is external, but doesn't have external or weak linkage!
%struct.ObjHeader* (%struct.ObjHeader*, %struct.ObjHeader**)* @"kfun:components.TransparentComposeWindow.object-1.<get-windowInfo>#internal"
fatal error: error in backend: Broken module found, compilation aborted!
* Source files:
* Compiler version: 1.9.10
* Output kind: FRAMEWORK
Łukasz Zieliński
09/25/2023, 6:34 AMViktor Nyblom
09/27/2023, 3:19 AMJeroen Flietstra
09/27/2023, 7:06 AMŁukasz Zieliński
09/27/2023, 9:08 AMViktor Nyblom
09/28/2023, 3:44 AMŁukasz Zieliński
09/28/2023, 3:57 PMViktor Nyblom
09/29/2023, 8:35 AMŁukasz Zieliński
09/30/2023, 12:50 PMViktor Nyblom
10/02/2023, 6:59 AM295: // super.viewSafeAreaInsetsDidChange() // TODO: call super after Kotlin 1.8.20
Erik Ziegler
11/10/2023, 3:04 PMaccessibilityController
in:
val platform = object : androidx.compose.ui.platform.Platform by androidx.compose.ui.platform.Platform.Empty {
override fun accessibilityController(owner: SemanticsOwner) = object : AccessibilityController {
override fun onSemanticsChange() = Unit
override fun onLayoutChange(layoutNode: LayoutNode) = Unit
override suspend fun syncLoop() = Unit
}
...
otherwise I would get the error
Uncaught Kotlin exception: kotlin.native.internal.IrLinkageError: Abstract function 'accessibilityController' is not implemented in non-abstract anonymous object
at 0 KMPTestApp 0x104b787f3 kfun:kotlin.Throwable#<init>(kotlin.String?){} + 123
at 1 KMPTestApp 0x104b7243b kfun:kotlin.Error#<init>(kotlin.String?){} + 119
at 2 KMPTestApp 0x104bb358b kfun:kotlin.native.internal.IrLinkageError#<init>(kotlin.String?){} + 119
at 3 KMPTestApp 0x104bb34ff kfun:kotlin.native.internal#ThrowIrLinkageError(kotlin.String?){}kotlin.Nothing + 175
at 4 KMPTestApp 0x1053d6587 kfun:TransparentComposeWindow.object-2.accessibilityController#internal + 99
at 5 KMPTestApp 0x10522ac93
Erik Ziegler
12/08/2023, 1:53 PMŁukasz Zieliński
12/08/2023, 1:55 PMErik Ziegler
12/08/2023, 2:11 PMErik Ziegler
12/08/2023, 2:11 PMJeroen Flietstra
12/08/2023, 2:19 PMErik Ziegler
12/08/2023, 2:30 PMJeroen Flietstra
12/08/2023, 4:21 PMkhalid64927
01/09/2024, 2:43 PMIvan Matkov
02/21/2024, 7:34 PM1.6.0-beta02
, opaque
flag is available out of the box
ComposeUIViewController(
configure = { opaque = false }, // Make compose scene background transparent
...
)
Jeroen Flietstra
02/21/2024, 7:50 PMJeroen Flietstra
02/21/2024, 7:55 PMErik Ziegler
02/21/2024, 9:42 PMŁukasz Zieliński
02/22/2024, 7:10 AMErik Ziegler
04/10/2024, 11:00 PMIvan Matkov
04/11/2024, 9:17 AM