You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过自定义cinterop配置在Kotlin Native中实现UIView子类化

UIView子类化及drawRect重写方案

可以实现,目前有两种成熟的落地方案:

方案1:直接匹配ObjC selector重写(无需修改cinterop配置)

Kotlin/Native的ObjC互操作层为了对齐Swift的API风格,会将部分ObjC原生实例方法映射为顶层扩展函数,这并不影响方法重写。只要你定义的方法签名完全匹配ObjC端的selector规则,即使导入时显示为不可重写的扩展,重写逻辑也能正常生效。
对应drawRect的实现示例:

import platform.UIKit.*
import platform.CoreGraphics.CGRect
import platform.Foundation.NSString

class SmileView : UIView {
    override fun drawRect(rect: CGRect) {
        super.drawRect(rect)
        val smile = ":)" as NSString
        smile.drawInRect(rect, withAttributes = null)
    }

    // 按需添加构造方法即可
    @OverrideInit
    constructor(frame: CGRect) : super(frame)

    @OverrideInit
    constructor(coder: NSCoder) : super(coder)
}

如果上述写法在你的Kotlin版本下出现编译报错,可以用自定义cinterop的方案解决。

方案2:自定义cinterop配置调整方法映射

你可以通过修改cinterop的配置规则,强制将drawRect生成为UIView的可重写成员方法:

  1. 项目中新建UIKitCustom.def文件,内容如下:
language = Objective-C
headers = UIKit/UIKit.h
headerFilter = UIKit/*
explicitlyMarkedAsObjectiveCMembers = UIView
  1. 在gradle的cinterop配置中引入该定义文件:
kotlin {
    iosTarget("ios") {
        compilations.main {
            cinterops {
                create("UIKitCustom") {
                    defFile = file("src/iosMain/cinterop/UIKitCustom.def")
                    packageName = "platform.UIKit"
                }
            }
        }
    }
}

同步项目后,CInterop会生成可直接重写的drawRect成员方法,按常规方式重写即可。


内容的提问来源于stack exchange,提问作者GaetanZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 10:09:06