CoderLineChan/SwiftlyUI
UIKit Plus: Infusing SwiftUI-like Development Efficiency. Revolutionizing UIKit development through chain syntax, resultBuilder, and modern APIs, retaining full native control while achieving SwiftUI-grade productivity. UIKit Plus: 注入 SwiftUI 式开发效率 通过链式语法与现代化 API 重构 UIKit 开发范式,在保留原生控制权的同时,获得 SwiftUI 级开发效率。
Installation Guide | 安装指南 <a name="安装指南"></a>
[[CocoaPods]](https://cocoapods.org/pods/SwiftlyUI) [[SPM]](https://swift.org/package-manager/)
CocoaPods
pod 'SwiftlyUI'
# Use if pod fails | 如果pod失败使用此方式
pod 'SwiftlyUI', :git => 'https://github.com/CoderLineChan/SwiftlyUI.git', :tag => '*.*.*'Swift Package Manager
dependencies: [
.package(url: "https://github.com/CoderLineChan/SwiftlyUI.git",
from: "*.*.*")
]Recommended Installation via SPM | 推荐使用SPM方式导入
Xcode -> File -> Add Package Dependencies... -> https://github.com/CoderLineChan/SwiftlyUI.git -> Add Package
Why Choose SwiftlyUI? <a name="技术优势全景图"></a>
✅ 渐进式迁移 无需重写现有代码,可逐步改造 UIKit 项目
✅ Progressive Migration Migrate existing code gradually without rewriting entire projects
✅ Swift 原生支持 专为 Swift 设计的链式语法,类型安全且 IDE 友好
✅ Native Swift Support Designed for Swift with chain syntax, type safety and IDE friendliness
✅ 完整 UIKit 能力 保留底层控件操作能力,不引入额外抽象层
✅ Full UIKit Capabilities Retain full underlying control capabilities, no extra abstraction layer
✅ 企业级兼容 支持 iOS 13+,完美适配存量项目
✅ Enterprise Compatibility Supports iOS 13+, perfectly adapts to existing projects
Features | 功能特性 <a name="功能特性"></a>
### Enhanced Containers with @resultBuilder for UIView and UIStackView
- Perfect nested containers replicating SwiftUI | 多容器嵌套完美复刻SwiftUI
```swift
//扩展的类:
UISpacer == UIView
ZStackView == UIView
HStackView == UIStackView
VStackView == UIStackView
VScrollView == UIScrollView
Label == UILabel
ImageView == UIImageView
```
```swift
let zView = ZStackView {// == UIView
UIView()
.frame(width: 300, height: 200)
.backgroundColor(.red.opacity(0.5))
.fillToSuperMargins()
VStackView(spacing: 10) {
HStackView(spacing: 10) {
Label("ACC:")
.font(.medium(14))
.width(50)
UITextField("input ACC")
.height(35)
.width(180)
}
.border(.orange)
.cornerRadius(5)
HStackView(spacing: 10) {
Label("PWD:")
.font(.medium(14))
.width(50)
UITextField("input PWD")
.height(35)
.width(180)
}
.border(.orange)
.cornerRadius(5)
}
.distribution(.fillEqually)
.centerToSuper()
}
.backgroundColor(.blue.opacity(0.5))
.padding(10)
.centerTo(view)
view.addSubview(zView)
```
### Chained Syntax: Property Setting Enhancement | 链式语法:属性设置增强
- 极简代码:比原生代码减少 60% 的冗余字符
- 内边距精准设置,支持单边/全局/横向/纵向
- 内置分割线系统,一行代码设置分割线,子视图增删/隐藏/显示时自动更新分隔线
```swift
let stackView = UIStackView()
/// 系统方法
.axis(.vertical)
.spacing(10)
.alignment(.center)
.distribution(.fillEqually)
/// 扩展方法
//1、 设置任意边距
.padding(.top, 20)
.padding(.left, 20)
.padding(.horizontal, 16)
.padding(.vertical, 10)
.padding(16)//设置上左下右边距都是16
.padding(UIEdgeInsets(top: 16, left: 16, bottom: 16, right: 16))
//2、设置分割线
.separator(color: .red, size: CGSize(width: 20, height: 2))
```
- 链式基础样式配置,告别碎片化的属性设置
- 扩展SwiftUI语法配置:(.border);(.radius);(.background)
```swift
let view = UIView()
/// 系统方法
.hidden(false)
.hidden()
.tag(100)
.userInteractionEnabled(false)
.userInteractionEnabled()
.shadow(color: .black, radius: 3, opacity: 0.3, offset: .zero)
.backgroundColor(.clear)
.cornerRadius(8)
.alpha(0.5)
/// 扩展方法
.border(.orange)
.border(.black, 2)//设置边框颜色与大小
.radius(10)
.radius(10, corners: .topLeft | .topRight)//设置圆角
.opacity(0.5)//与alpha一致
.background {//在底部添加视图
UIImageView("local_image_iocn_name")// 嵌入式背景视图
.imageName("local_image_iocn_name")//设置图片名
.image(UIImage(named: "local_image_iocn_name"))//直接设置图片
.contentMode(.scaleAspectFill)
.fillSuper()
//... 可以添加任何UIView
}
.overlay {//在主视图上面叠加视图
UIView()//可以是分割线
.backgroundColor(.lightGray)
.height(0.5)
.left.top.right.equalToSuper()
Label("文本")
.centerToSuper()
//... 可以添加任意UIView
}
.addContents {//添加子试图方式
UIView()//可以是分割线
.backgroundColor(.lightGray)
.height(0.5)
.left.top.right.equalToSuper()
//... 可以添加任意UIView
}
```
### 现代化交互封装:手势识别事件简化
支持UIKit所有手势类型:(.tap);(.doubleTap);(.longPress);(.pan);(.swipe);(.pinch);(.rotation)
```swift
//SwiftlyUI
let view = UIView()
.onGesture(.tap) { _ in print("tapAction") }
//UIKit
let view = UIView()
view.isUserInteractionEnabled = true
let tap = UITapGestureRecognizer(target: self, action: #selector(tapAction))
view.addGestureRecognizer(tap)
@objc func tapAction() {
print("tapAction")
}
```
### 声明式动画引擎:像 SwiftUI 一样驱动 UIKit
```swift
// SwiftlyUI
withAnimation(.easeInOut) {
self.view.transform = CGAffineTransform(scaleX: 1.2, y: 1.2)
} completion: { _ in print("animation completed") }
// UIKit
UIView.animate(withDuration: 0.3, delay: 0, options: .curveEaseInOut) {
self.view.transform = CGAffineTransform(scaleX: 1.2, y: 1.2)
} completion: { _ in
print("animation completed")
}
```
### Pre-Parent Constraints | 智能布局系统 Auto Layout :父视图前约束 + 自适应布局
- 添加父控件前约束,打破相对布局限制
```swift
let view = UIView()
.frame(width: 20)//the same as .width()
.frame(height: 100)//the same as .height()
.frame(minWidth: 50)
.frame(maxWidth: 200)
.leftTo(superView.leftAnchor, offset: 30)//添加父控件前
.topTo(superView, offset: 30)//Before adding superView
.fillTo(superView)
.fillTo(brother, UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10))
.leadingTo(superView)//Before adding superView
.bottomTo(superView)//添加父控件前
.width(20)//the same as .frame(width: 20)
.width(to: view, multiplier: 1.2)
superView.addSubview(view)
//需要注意:已经添加父控件后再布局的操作需要额外激活约束
view.leftToSuper()
view.activeConstraints()//激活约束
```
### UIControl & UIButton Multi-state Enhancement
- Action封装闭包,需要注意循环引用
```swift
let contorl = UIControl()
.onAction { [weak self] in self?.doSomething() }
.onAction(target: self, action: { $0.doSomething() })
.onAction(for: .touchUpInside, action: { [weak self] in self?.doSomething() })
.onAction(target: self, action: { (vc: ViewController, btn: UIButton) in
vc.doSomething()
btn.alpha = 0.5
})
```
```swift
let button = UIButton("btn")
.font(.bold(16))
.title("title", state: .normal)
.titleColor(.black, state: .normal)
.foregroundColor(.black, state: .normal)
.image(UIImage(named: "image"), state: .normal)
.imageName("local_imageName", state: .selected)
.backgroundColor(.red, state: .normal)
.backgroundImage(UIImage.gradient(colors: [.red, .green], direction: .leftToRight, size: CGSize(width: 100, height: 100)))
.backgroundImageName("local_imageName", state: .normal)
.cornerRadius(20)
.onAction(target: self, action: {$0.doSomething() })
```
### UITextView & UITextField:Enhanced Input Controls
- 一行代码实现 Placeholder
- Padding 精准设置内边距
- 控件事件简化监听文本变化
```swift
let textView = UITextView("placeholder Name")//or
let textField = UITextField("placeholder Name")
.font(.regular(16))
.textColor(.black)
.foregroundColor(.black)
.alignment(.left)
.keyboardType(.numberPad)
.text("input text")
.placeholder("placeholder", color: .placeholderText)
.editable(true)
.maxLength(50)
.padding()
.padding(.horizontal, 10)
.padding(.vertical, 10)
.onTextChange{ print("onTextChange: \($0)") }
.onTextChange{ print("onTextChange: \($0.text)") }
.onBeginEditing(onBeginEditingAction)
.onEndEditing(onEndEditingAction)
```
### Usage Examples | 使用示例 <a name="使用示例"></a>
<p align="center">
<img src="https://github.com/CoderLineChan/SwiftlyUI/blob/main/Example/SampleGraphs/SampleGraph_1.png" width="1000px"/>
</p>
<p align="center">
<img src="https://github.com/CoderLineChan/SwiftlyUI/blob/main/Example/SampleGraphs/SampleGraph_2.png" width="1000px"/>
</p>
<p align="center">
<img src="https://github.com/CoderLineChan/SwiftlyUI/blob/main/Example/SampleGraphs/SampleGraph_3.png" width="1000px"/>
</p>
<p align="center">
<img src="https://github.com/CoderLineChan/SwiftlyUI/blob/main/Example/SampleGraphs/SampleGraph_4.png" width="1000px"/>
</p>
<p align="center">
<img src="https://github.com/CoderLineChan/SwiftlyUI/blob/main/Example/SampleGraphs/SampleGraph_5.png" width="1000px"/>
</p>Package Metadata
Repository: CoderLineChan/SwiftlyUI
Stars: 262
Forks: 28
Open issues: 0
Default branch: main
Primary language: swift
License: Apache-2.0
Topics: swift5, swift6, swifter, swifterui, swifteruikit, swiftlyui, swiftui, swiftuikit, uikit
README: README.md