- August 28, 2025
- Mins Read
High performance and lightweight UIView, UIImage, UIImageView, UIlabel, UIButton and more.
then on both main thread and background in one Promise.Swift Package Manager is a tool for managing the distribution of Swift code. It’s integrated with the Swift build system to automate the process of downloading, compiling, and linking dependencies.
Xcode 11.0+ is required.
To integrate SwiftyUI into your Xcode project using Swift Package Manager
Search Package Dependencies in PROJECT:
SwiftyUI
Or, add it to the dependencies value of your Package.swift:
dependencies: [
.package(url: “https://github.com/haoking/SwiftyUI.git”, .upToNextMajor(from: “1.0.0”))
]
CocoaPods is a dependency manager for Cocoa projects. You can install it with the following command:
$ gem install cocoapods
CocoaPods 1.1+ is required.
To integrate SwiftyUI into your Xcode project using CocoaPods, specify it in your Podfile:
source ‘https://github.com/CocoaPods/Specs.git’
platform :ios, ‘8.0’
use_frameworks!
target ‘<Your Target Name>’ do
pod ‘SwiftyUI’
end
Then, run the following command:
$ pod install
SwiftyView have a auto GPU rendering on color and Image showing.
import SwiftyUI
let myView : SwiftyView = SwiftyView().addTo(view)
myView.frame = CGRect.init(x: 50, y: 50, width: 100, height: 100)
You can also invoke UIView function directly, it also have most of the SwiftyView performance feature.
But if you want to have complete benefits, I suggest you to use SwiftyView, and it actually inherits from UIView.
let myView : UIView = UIView()
view.addSubview(myView)
myView.frame = CGRect.init(x: 50, y: 50, width: 100, height: 100)
color from Hex
colorRGBA value from UIColor
import SwiftyUI
let myColor: UIColor = .hex(0xccff00) // .hex(“333399”)
let redFloat: CGFloat = myColor.redValue //greenValue, blueValue, alphaValue
colors from Image, also return block is on main thread:
import SwiftyUI
myImage?.colors({ (background, primary, secondary, detail) in
print(“background color: \(background)”)
print(“primary color: \(primary)”)
print(“secondary color: \(secondary)”)
print(“detail color: \(detail)”)
})
There are several UIImage extensions designed to make the common image manipulation operations as simple as possible.
let myImage : UIImage? = UIImage.load(“aImage”)
myImage.inflate()
Inflating compressed image formats (such as PNG or JPEG) in a background queue can significantly improve drawing performance on the main thread.
let myImage : UIImage? = UIImage.load(“aImage”)
let size = CGSize(width: 100.0, height: 100.0)
let scaledImage = myImage.reSize(to: size)
let scaledToFitImage = myImage.reSize(toFit: size)
let scaledToFillImage = myImage.reSize(toFill: size)
let myImage : UIImage? = UIImage.load(“aImage”)
let radius: CGFloat = 10.0
let roundedImage = myImage.rounded(withCornerRadius: radius)
let circularImage = myImage.roundedIntoCircle()
The ImageCachePool in SwiftyUI fills the role of that additional caching layer. It is an in-memory image cache used to store images up to a given memory capacity. When the memory capacity is reached, the image cache is sorted by last access date, then the oldest image is continuously purged until the preferred memory usage after purge is met. Each time an image is accessed through the cache, the internal access date of the image is updated.
let imageCachePool : ImageCachePool = .defalut
Interacting with the ImageCache protocol APIs is very straightforward.
let imageCachePool : ImageCachePool = .defalut
let myImage : UIImage? = UIImage.load(“aImage”)
imageCachePool.add(myImage, withIdentifier: “myImage”)
let cachedMyImage = imageCachePool.image(withIdentifier: “myImage”)
imageCachePool.removeImage(withIdentifier: “myImage”)
SwiftyImagView inherits from UIView and ImageSettable Protocol and its extension. Also has a better performance.Yet to provide the foundation of the SwiftyImagView extension. Due to the powerful support of these classes, protocols and extensions, the SwiftyImagView APIs are concise, easy to use and contain a large amount of functionality.
let myImage : UIImage? = UIImage.load(“btnBG”)
let myImageView : SwiftyImageView = SwiftyImageView(myImage).addTo(view)
myImageView.frame = CGRect.init(x: 50, y: 150 + 20, width: 100, height: 100)
By default, there is no image transition animation when setting the image on the image view. If you wish to add a cross dissolve or flip-from-bottom animation, then specify an ImageTransition with the preferred duration.
let myImage : UIImage? = UIImage.load(“btnBG”)
let myImageView : SwiftyImageView = SwiftyImageView(myImage).addTo(view)
myImageView.frame = CGRect.init(x: 50, y: 150 + 20, width: 100, height: 100)
let myTransition : SwiftyImageView.ImageTransition = .flipFromBottom(0.2)
myImageView.transition(myTransition, with: UIImage.load(“aImage”)!)
SwiftyLabel is a better performance than UILabel and can be used like a standard UI component. Also, Easier to use than UILabel. Since UIView is inherited instead of UILabel, there is little wasteful processing. It uses the function of TextKit to draw characters.
let myLable : SwiftyLabel = SwiftyLabel(“Label”, .white, .blue).addTo(view)
myLable.frame = CGRect.init(x: 50, y: 300 + 20 + 20, width: 100, height: 100)
SwiftyButton is a better performance than UIButton and can be used like a standard UI component. Also, Easier to use than UIButton because of block-package and mistake double tap IgnoreEvent. Since UIControl is inherited instead of UIbutton, there is little wasteful processing. It uses the function of TextKit to draw characters and Image feature from GPU.
let myBtn : SwiftyButton = SwiftyButton(“Button”, myImage, ClosureWrapper({ [weak self] (btn) in
guard let strongSelf = self, let btn = btn else { return }
// do something
})).addTo(view)
myBtn.frame = CGRect(x: 50, y: 450 + 20 + 20 + 20, width: 100, height: 100)
SwiftyTimer is running on RunLoop.
Timer.every(1.0, ClosureWrapper({ (timer) in
print(“Timer_every”)
})).start()
Timer.after(5.0, ClosureWrapper({ (timer) in
print(“Timer_after”)
})).start()
SwiftyToas is depend on global runloop cente, also show the toast without overlap.
SwiftyToast.load(“This is a Toast”)
SwiftyAlert contains SuccessAlert, ErrorAlert, WarningAlert, InfoAlert, EditAlert and their special styles.
let alert: SwiftyAlertView = .create()
_ = alert.addTextField()
_ = alert.addButton(“First Button”, action: {
print(“First Button tapped”)
})
_ = alert.addButton(“Second Button”) {
print(“Second button tapped”)
}
let theAlert: SwiftyAlertViewResponder = alert.showSuccess(“Congratulations”, subTitle: “You’ve just displayed this awesome Pop Up View”) //showError, showWarning, showInfo, showEdit
theAlert.setDismissBlock {
print(“Alert Dismissed”)
}
ThreadPool is used to manage threads which depends on active CPUs, also autorelease Runloop inside.
let myOperation : BlockOperation = .init {
print(“task2—-Thread:\(Thread.current)”)
for i in 1…3
{
print(“Task——-\(i)”)
}
}
ThreadPool.defalut.add(myOperation)
Everyone knows PromiseKit and its story. I also use this library in my code. But it is too heavy for my code, so I build a lightweight version of PromiseKit, based partially on Javascript’s A+ spec, depends on ThreadPool.
If you dont need send value from different threads in a Premise, it will be simple:
Promise<Void>.firstly(with: nil, on: .background) {
print(“Promise<Void>—task1—-Thread:\(Thread.current)”)
}.then(on: .main) {
print(“Promise<Void>—task2—-Thread:\(Thread.current)”)
throw SimpleError()
}.then {
print(“Promise<Void>—task3—-Thread:\(Thread.current)”)
}.always {
print(“Promise<Void>—taskAlways—-Thread:\(Thread.current)”)
}.catch { (error) in
print(“Promise<Void>—error\(String(describing: error))”)
}
Also you need to share or send value in different threads in a Promise, you should code as below:
Promise<String>.firstly(on: .background) { (update, _) in
print(“task1—-Thread:\(Thread.current)”)
update(“abc”)
}.then { (update, str) in
print(“thenthenthenthenthenthen—-\(String(describing: str))”) // abc
var str = str
str?.append(“aaaaaaaa”) // aaaaaaaaabc
update(str)
}.then(with: nil, on: .main) { (_, str) in
print(“mainmainmainmainmainmainmain—-\(String(describing: str))”) // aaaaaaaaabc
}.catch()
This package provides you with an easy way to show tooltips over any SwiftUI view, since Apple does not provide ...
SimpleToast is a simple, lightweight, flexible and easy to use library to show toasts / popup notifications inside iOS or ...
Create Toast Views with Minimal Effort in SwiftUI Using SSToastMessage. SSToastMessage enables you to effortlessly add toast notifications, alerts, and ...