UIKit 被設計為可通過子類和多載方法使用。
通常,UIView的drawRect objective-C方法在SWIFT中是這樣實作的:
import UIKit
import Foundation
class SmileView。UIView {
override func draw(_ rect: CGRect) {
super.draw(rect)
let smile = ":)" as NSString >。
smile.draw(in: rect, withAttributes: nil)
}
}
不幸的是,Kotlin中的UIKit匯入將這些函式定義為不能被重寫的擴展函式。
有沒有人通過自定義的cinterop配置,從Kotlin成功地子類化了一個UIView?
uj5u.com熱心網友回復:
你可以直接跳過override,即完全多載,因為默認實作什么都不做(這就是為什么它在擴展中)。
例如,下一個也是有效的:
class SmileView。UIView {
func draw(_ rect: CGRect) {
let smile = " :)" as NSString
smile.draw(in: rect, withAttributes: nil)
}
}
下面是一個界面的檔案:
摘要
在傳入的矩形內畫出接收者的影像。宣告
func draw(_ rect: CGRect) Discussion
這個方法的默認實作什么都不做。子類 使用Core Graphics和UIKit等技術來繪制其 視圖的內容的子類應該覆寫這個方法,并在這里實作他們的繪圖 代碼。
uj5u.com熱心網友回復:
因此,我們設法使其發揮作用。
1.在build.gradle.kts中添加一個cinterop配置任務
kotlin {
android()
ios {
二進制檔案 {
框架 {
baseName = "shared"/span>
}
}
compilations.getByName("main") {
val uikit by cinterops.creating {
}
}
2.添加一個`src/nativeinterop/cinterop/uikit.def`檔案。
package = demo.cinterop
語言 = Objective-C
-----
#import <Foundation/Foundation.h>
#import <UIKit/UIView.h>
@protocol UIViewWithOverrides
- (void) drawRect: (CGRect)aRect;
- (void) layoutSubviews;
@end
3.創建一個自定義的UIView類
。該類擴展了UIKit的UIView,并實作了之前創建的UIViewWithOverridesProtocol(后綴會自動添加)
package demo
import demo.cinterop.UIViewWithOverridesProtocol
import kotlinx.cinterop.*.
import platform.CoreGraphics.*.
import platform.UIKit.*.
@ExportObjCClass
class MyView() : UIView( frame = CGRectMake(. 0, .0, .0, .0)),UIViewWithOverridesProtocol {
override fun layoutSubviews() {
println("layoutSubviews")
setNeedsDisplay()
}
override fun drawRect(aRect。CValue<CGRect>) {
val rectAsString = aRect.useContents {
"" this.origin.x ", " this. origin.y ", "/span> (this. origin.x this.size.width) ", " (this.origin.y this.size.height)
}
println("drawRect:: Rect[$rectAsString]")
val context: CPointer<CGContext>? = UIGraphicsGetCurrentContext()
CGContextSetLineWidth(context, 2.0)
val components = cValuesOf(0.0, 0.0, 1.0, 1.0)
CGContextSetFillColor(context, components)
val square = CGRectMake(100.0, 100.0, 200.0, 200.0)
CGContextFillRect(context, square)
}
}
fun createMyView()。UIView = MyView()
4.從Swift中使用它
struct ChartView。View {
var body。some View {
VStack {
Text("Chart View"/span>)
MyView()
.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
}
}
}
struct ChartView_Previews: PreviewProvider {
static var previews: some View {
ChartView()
}
}
struct MyView: UIViewRepresentable {
func makeUIView(context: Context) -> UIView {
UIChartViewKt.createMyView()
}
func updateUIView(_ UIView: UIView, context: Context) {
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/332810.html
標籤:
