{"id":26739409,"url":"https://github.com/coderlinechan/swiftlyui","last_synced_at":"2025-04-14T15:35:38.688Z","repository":{"id":283100199,"uuid":"950703344","full_name":"CoderLineChan/SwiftlyUI","owner":"CoderLineChan","description":"UIKit Plus 为 UIKit 注入 SwiftUI 的开发效率 通过链式语法和现代化 API 设计，让 UIKit 开发更简洁高效，同时保持完整控制权，实现「零转换成本」的 SwiftUI 式开发体验。","archived":false,"fork":false,"pushed_at":"2025-04-12T02:24:21.000Z","size":1289,"stargazers_count":26,"open_issues_count":0,"forks_count":3,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-12T03:27:45.293Z","etag":null,"topics":["swift5","swift6","swifter","swifterui","swifteruikit","swiftlyui","swiftui","swiftuikit","uikit"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/CoderLineChan.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-03-18T15:03:57.000Z","updated_at":"2025-04-12T02:24:24.000Z","dependencies_parsed_at":"2025-04-12T03:23:45.212Z","dependency_job_id":"69a9e1d9-68f1-4d7d-8d6a-5c48e6f4a64f","html_url":"https://github.com/CoderLineChan/SwiftlyUI","commit_stats":null,"previous_names":["coderlinechan/swiftlyui"],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CoderLineChan%2FSwiftlyUI","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CoderLineChan%2FSwiftlyUI/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CoderLineChan%2FSwiftlyUI/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CoderLineChan%2FSwiftlyUI/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/CoderLineChan","download_url":"https://codeload.github.com/CoderLineChan/SwiftlyUI/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248907030,"owners_count":21181265,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["swift5","swift6","swifter","swifterui","swifteruikit","swiftlyui","swiftui","swiftuikit","uikit"],"created_at":"2025-03-28T04:28:46.303Z","updated_at":"2025-04-14T15:35:38.682Z","avatar_url":"https://github.com/CoderLineChan.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SwiftlyUI \u0026 UIKit Plus\n**为 UIKit 注入 SwiftUI 的开发效率**  \n通过链式语法和现代化 API 设计，让 UIKit 开发更简洁高效，同时保持完整控制权，实现「零转换成本」的 SwiftUI 式开发体验。  \n\n\n## 快速导航 🗺️ | Quick Navigation\n- [安装指南 | Installation](#安装指南)\n- [为什么选择 SwiftlyUI？](#技术优势全景图)\n- [功能特性 | Features](#功能特性)\n- [使用示例](#使用示例)\n\n## 安装指南 📦| Installation \u003ca name=\"安装指南\"\u003e\u003c/a\u003e\n[![CocoaPods](https://img.shields.io/cocoapods/v/SwiftlyUI)](https://cocoapods.org/pods/SwiftlyUI)\n[![SPM](https://img.shields.io/badge/SPM-supported-green)](https://swift.org/package-manager/)\n### CocoaPods\n```ruby\n# 核心组件 | Core components\npod 'SwiftlyUI'\n# 如果pod失败，请使用以下方式\npod 'SwiftlyUI', :git =\u003e 'https://github.com/CoderLineChan/SwiftlyUI.git', :tag =\u003e '1.1.1'\n```\n\n### Swift Package Manager\n```swift\ndependencies: [\n    .package(url: \"https://github.com/CoderLineChan/SwiftlyUI.git\", \n             from: \"1.1.1\")\n]\n```\n### 安装成功后设置全局导入\n在AppDelegate.swift文件中添加：\n```\n@_exported import SwiftlyUI\n```\n\n\n## 为什么选择 SwiftlyUI？ \u003ca name=\"技术优势全景图\"\u003e\u003c/a\u003e\n✅ **渐进式迁移** 无需重写现有代码，可逐步改造 UIKit 项目\n  \n✅ **Swift 原生支持** 专为 Swift 设计的链式语法，类型安全且 IDE 友好\n  \n✅ **完整 UIKit 能力** 保留底层控件操作能力，不引入额外抽象层\n  \n✅ **企业级兼容** 支持 iOS 13+，完美适配存量项目\n\n\n## 功能特性 ✨ | Features \u003ca name=\"功能特性\"\u003e\u003c/a\u003e\n\n### 使用@resultBuilder为 UIView和UIStackView容器增强\n- 多容器嵌套完美复刻SwiftUI\n```swift\nZStackView == UIView\nHStackView == UIStackView\nVStackView == UIStackView\n```\n```swift\nlet zView = ZStackView {// == UIView\n    UIView()\n        .frame(width: 300, height: 200)\n        .backgroundColor(.red.opacity(0.5))\n        .fillSuperMargins()\n    \n    VStackView(spacing: 10) {\n        HStackView(spacing: 10) {\n            Label(\"ACC:\")\n                .font(.medium(14))\n                .width(50)\n            \n            UITextField(\"input ACC\")\n                .height(35)\n                .width(180)\n            \n        }\n            .border(.orange)\n            .cornerRadius(5)\n        \n        HStackView(spacing: 10) {\n            Label(\"PWD:\")\n                .font(.medium(14))\n                .width(50)\n            \n            UITextField(\"input PWD\")\n                .height(35)\n                .width(180)\n        }\n            .border(.orange)\n            .cornerRadius(5)\n    }\n    .distribution(.fillEqually)\n    .centerToSuper()\n}\n    .backgroundColor(.blue.opacity(0.5))\n    .padding(10)\n    .center(to: view)\n\nview.addSubview(zView)\n```\n\n### 链式语法：属性设置增强\n- 极简代码：比原生代码减少 60% 的冗余字符\n- 内边距精准设置,支持单边/全局/横向/纵向\n- 内置分割线系统，一行代码设置分割线，子视图增删/隐藏/显示时自动更新分隔线\n```swift\nlet stackView = UIStackView()\n    .axis(.vertical)\n    .spacing(10)\n    .alignment(.center)\n    .distribution(.fillEqually)\n    .padding(.top, 20)\n    .padding(.left, 20)\n    .padding(.horizontal, 16)\n    .padding(16)\n    .separator(color: .red, size: CGSize(width: 20, height: 2))\n```\n\n- 链式基础样式配置，告别碎片化的属性设置\n- 扩展SwiftUI语法配置：(.border);(.radius);(.background)\n```swift\nlet view = UIView()\n    .backgroundColor(.clear)\n    .border(.orange)\n    .border(.black, 2)\n    .cornerRadius(8)\n    .alpha(0.5)\n    .opacity(0.5)\n    .hidden(false)\n    .hidden()\n    .tag(100)\n    .userInteractionEnabled(false)\n    .userInteractionEnabled()\n    .shadow(color: .black, radius: 3, opacity: 0.3, offset: .zero)\n    .background {\n        UIImageView()// 嵌入式背景视图\n            .imageName(\"icon\")\n            .contentMode(.scaleAspectFill)\n    }\n```\n\n### 现代化交互封装：手势识别事件简化\n支持UIKit所有手势类型：(.tap);(.doubleTap);(.longPress);(.pan);(.swipe);(.pinch);(.rotation)\n```swift\n//SwiftlyUI\nlet view = UIView()\n  .onGesture(.tap) { _ in print(\"tapAction\") }\n  .onGesture(.tap, action: tapAction)\n\n//UIKit\nlet view = UIView()\nview.isUserInteractionEnabled = true\nlet tap = UITapGestureRecognizer(target: self, action: #selector(tapAction))\nview.addGestureRecognizer(tap)\n\n@objc func tapAction() {\n    print(\"tapAction\")\n}\n```\n### 声明式动画引擎：像 SwiftUI 一样驱动 UIKit\n```swift\n// SwiftlyUI\nwithAnimation(.easeInOut) {\n    self.view.transform = CGAffineTransform(scaleX: 1.2, y: 1.2)\n} completion: { _ in print(\"animation completed\") }\n\n// UIKit\nUIView.animate(withDuration: 0.3, delay: 0, options: .curveEaseInOut) {\n    self.view.transform = CGAffineTransform(scaleX: 1.2, y: 1.2)\n} completion: { _ in\n    print(\"animation completed\")\n}\n\n```\n### 智能布局系统 Auto Layout ：前置约束 + 自适应布局\n- 添加父控件前约束，打破相对布局限制\n```swift\nlet view = UIView()\n    .frame(width: 20)//the same as .width()\n    .frame(height: 100)//the same as .height()\n    .frame(minWidth: 50)\n    .frame(maxWidth: 200)\n    .left(to: superView.leftAnchor, offset: 30)//添加父控件前\n    .top(to: superView, offset: 30)//Before adding superView\n    .fill(to: superView)\n    .fill(to: brother, UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10))\n    .leading(to: superView)//Before adding superView\n    .bottom(to: superView)//添加父控件前\n    .width(20)//the same as .frame(width: 20)\n    .width(to: view, multiplier: 1.2)\n\nsuperView.addSubview(view)\n```\n\n### UIControl \u0026 UIButton 多状态增强\n- 高质量 Action 封装，告别 告别 Target-Action 的原始时代\n```swift\nlet contorl = UIControl()\n    .onAction { print(\"click\") }\n    .onAction(for: .touchUpInside, action: { print(\"click\") })\n```\n\n```swift\nlet button = UIButton()\n    .font(.bold(16))\n    .title(\"title\", state: .normal)\n    .titleColor(.black, state: .normal)\n    .foregroundColor(.black, state: .normal)\n    .image(UIImage(named: \"image\"), state: .normal)\n    .imageName(\"local_imageName\", state: .selected)\n    .backgroundColor(.red, state: .normal)\n    .backgroundImage(UIImage.gradient(colors: [.red, .green], direction: .leftToRight, size: CGSize(width: 100, height: 100)))\n    .backgroundImageName(\"local_imageName\", state: .normal)\n    .cornerRadius(20)\n    .onAction{ print(\"action\") }\n```\n\n### UITextView \u0026 UITextField：输入控件增强，比原生更易用的文本处理\n- 一行代码实现 Placeholder\n- Padding 精准设置内边距\n- 控件事件简化监听文本变化\n```swift\nlet textView = UITextView()//or\nlet textField = UITextField()\n    .font(.regular(16))\n    .textColor(.black)\n    .foregroundColor(.black)\n    .alignment(.left)\n    .keyboardType(.numberPad)\n    .text(\"input text\")\n    .placeholder(\"placeholder\", color: .placeholderText)\n    .editable(true)\n    .maxLength(50)\n    .padding()\n    .padding(.horizontal, 10)\n    .padding(.vertical, 10)\n    .onTextChange{ print(\"onTextChange: \\($0)\") }\n    .onTextChange{ print(\"onTextChange: \\($0.text)\") }\n    .onBeginEditing(onBeginEditingAction)\n    .onEndEditing(onEndEditingAction)\n```\n\n### 使用示例 \u003ca name=\"使用示例\"\u003e\u003c/a\u003e\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"https://github.com/CoderLineChan/SwiftlyUI/blob/main/Example/SampleGraphs/SampleGraph_1.png\" width=\"1000px\"/\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"https://github.com/CoderLineChan/SwiftlyUI/blob/main/Example/SampleGraphs/SampleGraph_2.png\" width=\"1000px\"/\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"https://github.com/CoderLineChan/SwiftlyUI/blob/main/Example/SampleGraphs/SampleGraph_3.png\" width=\"1000px\"/\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"https://github.com/CoderLineChan/SwiftlyUI/blob/main/Example/SampleGraphs/SampleGraph_4.png\" width=\"1000px\"/\u003e\n\u003c/p\u003e\n\n\n\n\n\n\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcoderlinechan%2Fswiftlyui","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcoderlinechan%2Fswiftlyui","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcoderlinechan%2Fswiftlyui/lists"}