其他分享
首页 > 其他分享> > InterfaceKit--One line of code to implement interfaces of UIKit,AppKit,and WatchKit in SwiftUI inter

InterfaceKit--One line of code to implement interfaces of UIKit,AppKit,and WatchKit in SwiftUI inter

作者:互联网

One line of code to implement interfaces of UIKit,AppKit,and WatchKit in SwiftUI interface!

cn Chinese (Simplified): 中文文档
Code interpretation document: https://github.com/adong666666/InterfaceKitDoc(or this repository's Docs)

The basic idea of InterfaceKit is that we want some user interface abstraction layer that sufficiently encapsulates actually calling UIKit,AppKit,and WatchKit directly. It should be simple enough that common things are easy, but comprehensive enough that complicated things are also easy.

You can check out more about the project direction in the vision document.

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

Features

Usage

Universal

For iOS or tvOS:

InterfaceView(MyUIView())
InterfaceViewController(MyUIViewController())

For macOS:

NSInterfaceView(MyNSView())
NSInterfaceViewController(MyNSViewController())

For watchOS:

WKInterfaceView(MyWKInterfaceObject())

eg.

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

With Closure

You can do something while presenting SwiftUI view.

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)

Multiple platforms

InterfaceKit makes it clearer for multiple platforms programming.

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

Requirements

Communication

Status

This project is actively under development. We consider it ready for production use.

Installation

Below is a table that shows which version of InterfaceKit you should use for your Swift version.

Swift InterfaceKit
5.X >= 5.4.0

InterfaceKit supports multiple methods for installing the library in a project.

Copy to your project

Clone the repository by running the following command:

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

Copy the Swift files in InterfaceKit folder to your project.

Copy files

CocoaPods

CocoaPods is a dependency manager for Cocoa projects. For usage and installation instructions, visit their website. If you have not installed CocoaPods, just install it with the following command:

$ gem install cocoapods

You need a `Podfile` to Integrate InterfaceKit into your Xcode project with CocoaPods. If you do not have a Podfile, just create one or use the Podfile provided in `PodfileExample` folder by this repository. Podfile is as follows.
# 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

Replace YOUR_TARGET_NAME with your project name.
To integrate InterfaceKit into your Xcode project using CocoaPods, specify it in your Podfile:

pod 'InterfaceKit'

Maybe you have not update CocoaPods, then InterfaceKit may not be found, you can run pod update to update CocoaPods, or just run the following command.

pod 'InterfaceKit', :git => 'https://github.com/adong666666/InterfaceKit.git'
pod 'InterfaceKit/UIKit'
pod 'InterfaceKit/AppKit'
pod 'InterfaceKit/WatchKit'
pod 'InterfaceKit', :git => 'https://github.com/adong666666/InterfaceKit.git'
pod 'InterfaceKit', :git => 'https://github.com/adong666666/InterfaceKit.git', :branch => 'master'#, commit: "b7e1facdedd8fe16d04ef5f47c4697e89bad9f27", '~> 5.4.0', :tag => '5.4.0'

Then, in the Podfile directory(Make sure that your Podfile and your xcodeproj file are in the same directory), run the following command:

$ pod install
Podfile Location

Carthage

Carthage is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks.

  1. To integrate InterfaceKit into your Xcode project using Carthage, specify it in your Cartfile(If you don't have Cartfile, just create one or use the Cartfile provided by this repository in CartfileExample folder):
github "adong666666/InterfaceKit" "master"
  1. Then, in the Cartfile directory(Make sure that your Podfile and your xcodeproj file are in the same directory), run carthage update --use-xcframeworks.
    OR
    • For iOS project, Run carthage update --platform iOS.
    • For macOS project, Run carthage update --platform macOS.
    • For tvOS project, Run carthage update --platform tvOS.
    • For watchOS project, Run carthage update --platform watchOS.
Cartfile Location
  1. On your application targets’ "General" settings tab, in the "Frameworks,Libraries,and Embedded Content" section, drag and drop InterfaceKit xcframework (or just select the appropriate framework from xcframework) from the Carthage/Build folder on disk.

Carthage as a Static Library

Carthage defaults to building InterfaceKit as a Dynamic Library.

If you wish to build InterfaceKit as a Static Library using Carthage you may use the script below to manually modify the framework type before building with Carthage:

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

The Swift Package Manager is a tool for automating the distribution of Swift code and is integrated into the swift compiler. It is in early development, but InterfaceKit does support its use on supported platforms.

  1. Once you have your Swift package set up, adding InterfaceKit as a dependency is as easy as adding it to the dependencies value of your Package.swift. Then run swift build.
dependencies: [
    .package(url: "https://github.com/adong666666/InterfaceKit.git", .upToNextMajor(from: "5.4.0"))
]

OR

  1. In Xcode, select File > Swift Packages > Add Package Dependency.
  2. Follow the prompts using the URL("https://github.com/adong666666/InterfaceKit.git") for this repository.
Swift Package Manager Configuration

Manually

If you prefer not to use any of the aforementioned dependency managers, you can integrate InterfaceKit into your project manually.

Embedded Framework

$ git init
$ git submodule add https://github.com/adong666666/InterfaceKit.git
Drag and drop xcodeproj Add framework

Unzip,drag and drop

  1. Unzip the InterfaceKit.xcframework.zip file provided by the repository.
Unzip
  1. On your application targets’ “General” settings tab, in the "Frameworks,Libraries,and Embedded Content" section, drag and drop the unzipped file InterfaceKit.xcframework (or just select the appropriate framework from InterfaceKit.xcframework).
Use xcframeworks Use frameworks

FAQ

Why use InterfaceKit?

One line of code to implement interfaces of UIKit,AppKit,and WatchKit in SwiftUI interface! InterfaceKit supports for all four platforms(iOS, macOS, tvOS, watchOS). InterfaceKit is constantly updated.

Credits

InterfaceKit is owned and maintained by Saidong Zhang. You can follow him on github at @Github for project updates and releases.

Security Disclosure

If you believe you have identified a security vulnerability with InterfaceKit, you should report it as soon as possible via email to 3440217568@qq.com.

Donations

No donation required, but thanks anyway.

Contributing

Hey! Do you like InterfaceKit? Awesome! We could actually really use your help!

Open source isn't just writing code. InterfaceKit could use your help with any of the following:

If any of that sounds cool to you, send a pull request! After your first contribution, we will add you as a member to the repo so you can merge pull requests and help steer the ship

标签:Podfile,use,code,UIKit,--,project,git,InterfaceKit,your
来源: https://www.cnblogs.com/adong666666/p/14723734.html