InterfaceKit:一行代碼實現(xiàn)在SwiftUI界面使用UIKit、AppKit和WatchKit的接口!

一行代碼實現(xiàn)在SwiftUI界面使用UIKit、AppKit和WatchKit的接口!

English: English Document
代碼解釋文檔:https://github.com/adong666666/InterfaceKitDoc(或此存儲庫的Docs

InterfaceKit的基本思想是,我們想要一些用戶界面抽象層,它能充分封裝直接調(diào)用UIKit,AppKit和WatchKit。它應該足夠簡單,使普通的東西容易,但要足夠全面,使復雜的東西也容易。

您可以在愿景中查看有關項目方向的更多信息。

                    ┌──────────────┐
                    │   SwiftUI    │
                    └──────▲───────┘
                           │        
┌──────────────────────────┴───────────────────────────┐
│                    InterfaceKit                      │
└───────▲──────────────────▲───────────────────▲───────┘
        │                  │                   │        
┌───────┴──────┐    ┌──────┴───────┐    ┌──────┴───────┐
│     UIKit    │    │    AppKit    │    │   WatchKit   │
└──────────────┘    └──────────────┘    └──────────────┘

功能

  • 在SwiftUI界面使用UIKit
  • 在SwiftUI界面使用AppKit
  • 在SwiftUI界面使用WatchKit

使用

常規(guī)用法

對于iOS或tvOS:

  • 展示UIView
InterfaceView(MyUIView())
  • 展示UIViewController
InterfaceViewController(MyUIViewController())

對于macOS:

  • 展示NSView
NSInterfaceView(MyNSView())
  • 展示NSViewController
NSInterfaceViewController(MyNSViewController())

對于watchOS:

  • 展示W(wǎng)KInterfaceObject
WKInterfaceView(MyWKInterfaceObject())

示例:

import SwiftUI
import InterfaceKit

struct MyInterfaceView: View {
    var body: some View {
        ZStack {
            InterfaceViewController(MyViewController())
            InterfaceView(MyView())
            SwiftUIView()
        }
    }
}

#if DEBUG
struct MyInterfaceView_Previews: PreviewProvider {
    static var previews: some View {
        MyInterfaceView()
    }
}
#endif

配合閉包使用

展示SwiftuI視圖時,您可以執(zhí)行一些操作。

  • 示例
InterfaceViewController(MyUIViewController.shared, {
    print("Hello World")
    MyUIViewController.shared.delegate = SomeViewControler.shared
    MyUIViewController.shared.view.alpha = 0.5
    MyUIViewController.shared.view.backgroundColor = .white
    MyUIViewController.someFunction()
    networkRequest()
    JSONParsing()
    downloadFile()
    showProgress()
    makeToast()
    databaseOperation()
    //do something
    ...
})
.navigationBarBackButtonHidden(false)
.navigationBarHidden(false)
.navigationBarTitle(I18n.localizedString("Title"), displayMode: .large)

多平臺

InterfaceKit 讓多平臺編程更加清晰。

  • 示例
import SwiftUI
import MapKit
import InterfaceKit

let kStr = "Hello World"
#if os(iOS) || os(tvOS)
    typealias OSViewController = UIViewController
    typealias OSView = UILabel
    typealias OSInterfaceView = InterfaceView
    typealias OSInterfaceVC = InterfaceViewController
    let kBounds = UIScreen.main.bounds as CGRect?
#elseif os(macOS)
    typealias OSViewController = NSViewController
    typealias OSView = NSTextField
    typealias OSInterfaceView = NSInterfaceView
    typealias OSInterfaceVC = NSInterfaceViewController
    let kBounds = NSScreen.main?.frame
#endif

@main
struct EApp: App {
    var body: some Scene {
        WindowGroup {
            ZStack {
                #if !os(watchOS)
                    OSInterfaceView(MKMapView())
                    OSInterfaceView(MyView(), { print(kStr) })
                    OSInterfaceVC(MyVC())
                #else
                    WKInterfaceView(WKInterfaceMap(), { print(kStr) })
                #endif
                Text(kStr).foregroundColor(.purple)
            }
        }
    }
}

#if !os(watchOS)
class MyVC: OSViewController {
    #if os(iOS) || os(tvOS)
        override func viewDidLoad() {
            let lbl = MyView()
            lbl.textAlignment = .right
            view.addSubview(lbl)
        }
    #elseif os(macOS)
        override func loadView() { view = MyView() }
    #endif
}

class MyView: OSView {
    override init(frame: CGRect) {
        super.init(frame: CGRect(x: 0, y: kBounds!.height / 2 - 60, width: kBounds!.width, height: 40))
        #if os(iOS) || os(tvOS)
            text = kStr
        #elseif os(macOS)
            stringValue = kStr
        #endif
    }
    
    required init?(coder: NSCoder) { fatalError() }
}
#endif

平臺

  • iOS 13.0+ / macOS 10.15+ / tvOS 13.0+ / watchOS 6.0+
  • Xcode 11+
  • Swift 5.1+

交流

  • QQ群:1027277979
  • 您可以和我聯(lián)系(郵箱:3440217568@qq.com,QQ:3440217568,微信:adongenjoylife,電話:15674119605)。
  • 如果您發(fā)現(xiàn)了一個bug,并且可以提供可靠地重現(xiàn)它的步驟,請打開一個問題。
  • 如果您有一個特性請求,請打開一個問題。
  • 如果您想貢獻,請?zhí)峤灰粋€拉取請求。

狀態(tài)

這個項目正在積極開發(fā)中。我們認為它可以用于項目開發(fā)。

安裝

下表顯示了您應該根據(jù)您的Swift版本使用哪個版本的InterfaceKit。

Swift InterfaceKit
5.X >= 5.4.0

InterfaceKit支持多種方法在項目中安裝框架。

直接拷貝

通過運行以下命令來克隆此存儲庫:

git clone https://github.com/adong666666/InterfaceKit.git --depth=1

將github工程中的InterfaceKit文件夾下的Swift文件復制到您的工程中。
<div align="center"><img src="https://github.com/adong666666/InterfaceKit/raw/master/Pictures/copy_files.png" alt="拷貝文件" /></div>

  • 如果是iOS或tvOS項目,您可以復制文件UIInterface.swift
  • 如果是macOS項目,您可以復制文件NSInterface.swift
  • 如果是watchOS項目,您可以復制文件WKInterface.swift。

CocoaPods安裝

CocoaPods 是Cocoa項目的依賴關系管理器。有關使用和安裝說明,請訪問他們的網(wǎng)站。如果您還沒有安裝cocoapods則請先執(zhí)行如下命令:

$ gem install cocoapods

<br />
您需要一個Podfile文件來通過CocoaPods整合InterfaceKit到您的Xcode工程中去, 如果您沒有Podfile,那么直接創(chuàng)建一個Podfile或使用此存儲庫在PodfileExample文件夾中提供的Podfile。Podfile的內(nèi)容如下:

# Podfile
source 'https://github.com/CocoaPods/Specs.git'
# platform:ios, '13.0'
use_frameworks!
inhibit_all_warnings!

target 'YOUR_TARGET_NAME' do
    pod 'InterfaceKit'
end

# post_install do |installer_representation|
#   installer_representation.pods_project.targets.each do |target|
#     target.build_configurations.each do |config|
#       config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '13.0'
#     end
#   end
# end

用您的項目名稱替換YOUR_TARGET_NAME。
要使用CocoaPods將InterfaceKit集成到Xcode項目中,請在Podfile中指定它:

pod 'InterfaceKit'

或許您還沒有更新CocoaPods, 那么InterfaceKit 可能不會被找到,您可以運行 pod update來更新CocoaPods,或者直接運行下面的命令行:

pod 'InterfaceKit', :git => 'https://github.com/adong666666/InterfaceKit.git'
  • 如果只是針對iOS或tvOS項目,您可以在Podfile中指定它:
pod 'InterfaceKit/UIKit'
  • 如果只是針對macOS項目,您可以在Podfile中指定它:
pod 'InterfaceKit/AppKit'
  • 如果只是針對watchOS項目,您可以在Podfile中指定它:
pod 'InterfaceKit/WatchKit'
  • 如果您要使用此框架的最新發(fā)布的版本,您可以在Podfile中指定它:
pod 'InterfaceKit', :git => 'https://github.com/adong666666/InterfaceKit.git'
  • 如果您要使用此框架的特定的某一個版本,您可以在Podfile中指定它:
pod 'InterfaceKit', :git => 'https://github.com/adong666666/InterfaceKit.git', :branch => 'master'#, commit: "b7e1facdedd8fe16d04ef5f47c4697e89bad9f27", '~> 5.4.0', :tag => '5.4.0'

然后,在Podfile所在的目錄中(確保Podfile和xcodeproj文件位于同一目錄中),運行以下命令:

$ pod install

<div align="center"><img src="https://github.com/adong666666/InterfaceKit/raw/master/Pictures/PodfileLocation.png" alt="Podfile位置" /></div>

Carthage

Carthage是一個分散的依賴關系管理器,它構(gòu)建依賴關系并為您提供二進制框架。

  1. 要使用Carthage將InterfaceKit集成到Xcode項目中,請在此您的Cartfile中指定它(如果沒有Cartfile,只需創(chuàng)建一個或使用此存儲庫在CartfileExample文件夾中提供的Cartfile):
github "adong666666/InterfaceKit" "master"
  1. 然后,在Cartfile目錄中(確保Podfile和xcodeproj文件位于同一目錄中),運行carthage update --use xcframeworks
    或者

    • 對于iOS工程, 運行carthage update --platform iOS。
    • 對于macOS工程, 運行carthage update --platform macOS
    • 對于tvOS工程, 運行carthage update --platform tvOS。
    • 對于watchOS工程, 運行carthage update --platform watchOS
      <div align="center"><img src="https://github.com/adong666666/InterfaceKit/raw/master/Pictures/CartfileLocation.png" alt="Cartfile 位置" /></div>
  2. 在您的應用程序目標“General”設置選項卡的“Frameworks,Libraries,and Embedded Content”部分中,從磁盤上的Carthage/Build文件夾拖放InterfaceKitxcframework(或從xcframework中選擇合適的framework)。

Carthage作為靜態(tài)庫

Carthage默認將InterfaceKit構(gòu)建為一個動態(tài)庫。

如果您希望使用Carthage將InterfaceKit構(gòu)建為靜態(tài)庫,您可以在使用Carthage構(gòu)建之前使用下面的腳本手動修改框架類型:

carthage update InterfaceKit --platform iOS --no-build
sed -i -e 's/MACH_O_TYPE = mh_dylib/MACH_O_TYPE = staticlib/g' Carthage/Checkouts/InterfaceKit/InterfaceKit/InterfaceKit.xcodeproj/project.pbxproj
carthage build InterfaceKit --platform iOS

Swift Package Manager

Swift Package Manager是一種用于自動分發(fā)Swift代碼的工具,并集成到Swift編譯器中。它處于早期開發(fā)階段,但InterfaceKit仍支持在其支持的平臺上使用它。

  1. 設置Swift包后,將InterfaceKit添加為依賴項就像將其添加到package.Swiftdependencies的值一樣簡單。然后運行swift build
dependencies: [
    .package(url: "https://github.com/adong666666/InterfaceKit.git", .upToNextMajor(from: "5.4.0"))
]

或者

  1. 在Xcode中,選擇File > Swift Packages > Add Package Dependency。
  2. 安裝提示操作使用這個URL(“https://github.com/adong666666/InterfaceKit.git”)來集成此框架.
    <div align="center"><img src="https://github.com/adong666666/InterfaceKit/raw/master/Pictures/SwiftPackageManager.png" alt="Swift Package Manager配置" /></div>

手動設置

如果您不想使用上述任何依賴關系管理器,可以手動將InterfaceKit集成到項目中。

嵌入式框架

  • 打開Terminal,cd到頂級項目目錄,如果您的項目未初始化為git存儲庫,則運行以下命令:
$ git init
  • 通過以下命令來將InterfaceKit添加為git子模塊
$ git submodule add https://github.com/adong666666/InterfaceKit.git
  • 打開InterfaceKit文件夾,將InterfaceKit.xcodeproj拖到應用程序Xcode項目的項目導航器中。

    它應該嵌套在應用程序的藍色項目圖標下面。它是否高于或低于所有其他Xcode組并不重要。

<div align="center"><img src="https://github.com/adong666666/InterfaceKit/raw/master/Pictures/drag_framework.png" alt="拖放文件" /></div>

  • 在項目導航器中選擇InterfaceKit.xcodeproj,并驗證部署目標是否與應用程序目標匹配。

  • 接下來,在項目導航器(藍色項目圖標)中選擇您的應用程序項目,以導航到目標配置窗口,并在側(cè)邊欄的“Targets”標題下選擇應用程序目標。

  • 在該窗口頂部的選項卡欄中,打開“General”面板。

  • 單擊“Frameworks,Libraries,and Embedded Content”部分下的+按鈕。

  • 您將看到Workspace下的InterfaceKit文件夾,InterfaceKit文件夾下有InterfaceKit.frameworkInterfaceKitTests.xctest

    點擊InterfaceKit.framework,然后點擊Add

<div align="center"><img src="https://github.com/adong666666/InterfaceKit/raw/master/Pictures/add_framework.png" alt="添加框架" /></div>

  • 就這樣!

    InterfaceKit.framework在復制文件構(gòu)建階段自動添加為目標依賴項、鏈接框架和嵌入式框架,這是在模擬器和設備上構(gòu)建所需的全部內(nèi)容。

解壓,拖拽

  1. 解壓此存儲庫提供的InterfaceKit.xcframework.zip文件。
    <div align="center"><img src="https://github.com/adong666666/InterfaceKit/raw/master/Pictures/unzip.png" alt="解壓" /></div>

  2. 在應用程序目標的“General”設置選項卡上,在“Frameworks,Libraries,and Embedded Content”部分,拖放解壓縮后的文件InterfaceKit.xcframework(或從InterfaceKit.xcframework中選擇合適的framework)。

  • 如果您使用xcfamework,只需拖放InterfaceKit.xcframework。InterfaceKit.xcframework支持所有四種平臺(iOS、macOS、tvOS、watchOS)。
    <div align="center"><img src="https://github.com/adong666666/InterfaceKit/raw/master/Pictures/use_xcframeworks.png" alt="使用xcframework" /></div>

  • 如果您使用framework,請根據(jù)文件夾名稱和項目平臺從InterfaceKit.xcframework中選擇合適的框架。
    <div align="center"><img src="https://github.com/adong666666/InterfaceKit/raw/master/Pictures/use_frameworks.png" alt="使用framework" /></div>

常見問題

為什么使用 InterfaceKit?

一行代碼實現(xiàn)在SwiftUI界面使用UIKit、AppKit和WatchKit的接口! InterfaceKit 同時支持全部四個平臺(iOS, macOS, tvOS, watchOS)。InterfaceKit持續(xù)更新。

信用

InterfaceKit 由張賽東持續(xù)更新。 您可以關注他 @Github 以及時了解工程的更新與發(fā)布。

安全披露

如果您認為InterfaceKit存在安全漏洞,請您盡快通過郵箱告知:3440217568@qq.com。

捐獻

不需要捐獻,但仍表示感謝。

貢獻

您喜歡InterfaceKit嗎?真好!我們真的需要您的幫助!

開源不僅僅是編寫代碼。您可以幫我們做以下的任何一件事:

  • 查找(和報告)漏洞。
  • 新功能建議。
  • 回答問題。
  • 文件改進。
  • 查看拉取請求。
  • 幫助管理問題優(yōu)先級。
  • 修復錯誤/新功能。

如果您覺得這些聽起來很酷,發(fā)送一個請求!第一次貢獻之后,我們會將把您設置為此存儲庫的成員,以便您可以合并請求,您可以在我們的投稿人指南中閱讀更多的細節(jié)。

InterfaceKit的社區(qū)擁有巨大的正能量,維護人員致力于保持事物的精彩。就像 在CocoaPods社區(qū), 總是表現(xiàn)出積極的意圖;即使一個評論聽起來很刻薄,也要讓這個人從懷疑中受益。

請注意,這個項目伴隨著貢獻者的行為準則而發(fā)布。參與此項目即表示您同意遵守其條款.

添加新源文件

如果從InterfaceKIt添加或刪除源文件,則需要對此存儲庫根目錄下的InterfaceKIt.xcworkspace項目進行相應的更改。這個項目用于迦太基。別擔心,如果您忘記了,在提交拉取請求時會自動收到警告。

幫助我們改進InterfaceKit的文檔

無論您是核心成員還是第一次嘗試它的用戶,您都可以通過改進文檔對InterfaceKit做出有價值的貢獻。幫助我們:

  • 向我們發(fā)送有關您認為混淆或遺漏的內(nèi)容的反饋
  • 建議用更好的措辭或方式來解釋某些話題
  • 通過GitHub向我們發(fā)送拉取請求
  • 改進 英文文檔

上面的話太啰嗦了? 那么直接看下面吧。

  • 分叉此存儲庫!
  • 創(chuàng)建您的分支:git checkout -b my-new-feature
  • 提交您的更改:git commit -am 'Add some feature'
  • 推送至該分支:git push origin my-new-feature
  • 發(fā)起拉取請求
  • 其他:
    詳見貢獻。

許可

InterfaceKit是在MIT許可下發(fā)布的,詳見許可。

版本歷史

詳見版本歷史。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容