• Stars
    star
    710
  • Rank 63,751 (Top 2 %)
  • Language
    Swift
  • License
    MIT License
  • Created almost 4 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Easily use UIKit views in your SwiftUI applications. Create Xcode Previews for UIView elements

SwiftUIKitView

Swift Version Dependency frameworks Twitter

Easily use UIKit views in SwiftUI.

  • Convert UIView to SwiftUI View
  • Create Xcode Previews from UIView elements
  • SwiftUI functional updating UIView properties using a protocol with Associated Types.

You can read more about Getting started with UIKit in SwiftUI and visa versa.

Examples

Using SwiftUIKitView in Production Code

Using a UIKit view directly in SwiftUI for production code requires you to use:

UIViewContainer(<YOUR UIKit View>, layout: <YOUR LAYOUT PREFERENCE>)

This is to prevent a UIKit view from being redrawn on every SwiftUI view redraw.

import SwiftUI
import SwiftUIKitView

struct SwiftUIwithUIKitView: View {
    var body: some View {
        NavigationView {
            UIViewContainer(UILabel(), layout: .intrinsic) // <- This can be any `UIKit` view.
                .set(\.text, to: "Hello, UIKit!") // <- Use key paths for updates.
                .set(\.backgroundColor, to: UIColor(named: "swiftlee_orange"))
                .fixedSize()
                .navigationTitle("Use UIKit in SwiftUI")
        }
    }
}

Using SwiftUIKitView in Previews

Performance in Previews is less important, it's being redrawn either way.

Therefore, you can use the more convenient swiftUIView() modifier:

UILabel() // <- This is a `UIKit` view.
    .swiftUIView(layout: .intrinsic) // <- This is returning a SwiftUI `View`.

Creating a preview provider for a UIView looks as follows:

import SwiftUI
import SwiftUIKitView

struct UILabelExample_Preview: PreviewProvider {
    static var previews: some View {
        UILabel() // <- This is a `UIKit` view.
            .swiftUIView(layout: .intrinsic) // <- This is a SwiftUI `View`.
            .set(\.text, to: "Hello, UIKit!") // <- Use key paths for updates.
            .fixedSize() // <- Make sure the size is set
            .previewLayout(.sizeThatFits)
            .previewDisplayName("UILabel Preview Example")
    }
}

Which results in the following preview:

KeyPath updating

This framework also comes with a KeyPathReferenceWritable protocol that allows to update objects using functions and writable KeyPath references:

/// Defines a type that is configurable using reference writeable keypaths.
public protocol KeyPathReferenceWritable {
    associatedtype T
    associatedtype U
    
    func set<Value>(_ keyPath: ReferenceWritableKeyPath<T, Value>, to value: Value) -> U
}

public extension KeyPathReferenceWritable {
    func set<Value>(_ keyPath: ReferenceWritableKeyPath<Self, Value>, to value: Value) -> Self {
        self[keyPath: keyPath] = value
        return self
    }
}

/// Add inheritance for NSObject types to make the methods accessible for many default types.
extension NSObject: KeyPathReferenceWritable { }

This can be used as follows:

UILabel()
    .set(\.text, to: "Example")

And allows to easily build up SwiftUI style view configurations to keep the same readability when working in SwiftUI.

Installation

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 this SDK does support its use on supported platforms.

Once you have your Swift package set up, adding the SDK as a dependency is as easy as adding it to the dependencies value of your Package.swift.

dependencies: [
    .package(url: "https://github.com/AvdLee/SwiftUIKitView.git", .upToNextMajor(from: "2.0.0"))
]

Communication

  • If you found a bug, open an issue.
  • If you have a feature request, open an issue.
  • If you want to contribute, submit a pull request.

License

SwiftUIKitView is available under the MIT license, and uses source code from open source projects. See the LICENSE file for more info.

Author

This project is originally created by Antoine van der Lee. I'm open for contributions of any kind to make this project even better.

More Repositories

1

appstoreconnect-swift-sdk

The Swift SDK to work with the App Store Connect API from Apple.
Swift
1,431
star
2

CombineSwiftPlayground

A Swift playground explaining the concepts of the new Combine framework
Swift
1,102
star
3

Roadmap

Publish your roadmap inside your app and allow users to vote for upcoming features
Swift
797
star
4

Poes

A Swift command-line tool to easily send push notifications to the iOS simulator
Swift
453
star
5

RocketSimApp

Enhancing the iOS simulator for productivity
Swift
425
star
6

CoreDataBestPractices

Best Practices in Core Data explained within a demo application
Swift
413
star
7

WhatTheErrorCode

Convert unreadable errors into understandable descriptions
Swift
143
star
8

Moya-SwiftyJSONMapper

Map objects through SwiftyJSON in combination with Moya
Swift
115
star
9

AsyncOperations

Asynchronous Operations in Swift explained in a Swift Playground
Swift
92
star
10

QR-Code-Custom

A playground demonstrating a way to create a custom QR code with a custom color and logo in Swift.
Swift
42
star
11

TaskGroupsResultBuilder

A @resultBuilder to use to bundle tasks together.
Swift
36
star
12

AppUpdately

Fetch the update available status for iOS or macOS apps based on the bundle identifier.
Swift
36
star
13

CombineWorkshop

Contains all files needed for my Combine workshop.
Swift
32
star
14

appstoreconnect-app

A Mac App to control App Store Connect!
Swift
28
star
15

CustomSwiftOperators

Demonstrating custom Swift operators. Including prefix, postfix, infix, and compound assignment operators.
Swift
18
star
16

CombineExtensions

A collection of Combine Extensions
Swift
16
star
17

ALLocalizables

Localizable label and buttons directly from the interface builder
Ruby
14
star
18

ALDataRequestView

A view representation for data requests. Support for ReactiveSwift and RXSwift
Swift
13
star
19

StockAnalyzerApp

Public repo for tracking bugs and features for the Stock Analyzer app
Swift
7
star
20

DataRacesActors

Slides and content from my SwiftLeeds talk "Understanding Data Races and Actors in Swift 5.5"
Swift
7
star
21

UIControl-Blocks

Use blocks with UIControls
Objective-C
6
star
22

Moya-JASONMapper

Map objects through JASON in combination with Moya
Swift
5
star
23

ImageCollectionViewer

Get FB Albums and show them in a gallery
Objective-C
4
star
24

ImageGen

A library to generate images easily based on text input
4
star
25

MeetupRaffle

Raffle a member from a meetup event
Swift
3
star
26

organizing-conferences-checklist

General tips on organising conferences, based on feedback from the community
1
star