TTBaseUIKit (基础项目 - 一个通过基础视图快速创建 iOS 项目的框架)

TTBaseUIKit 是一个框架,它通过提供用 UIKit 编程式和 SwiftUI 编写的基础视图,帮助您以最快和最有效的方式构建 iOS 应用程序。TTBaseUIKit 当前版本支持 iOS 和 OS X 的所有版本,自每个平台上引入 Auto Layout 以来,均使用 Swift 语言和单个代码库。

在此更新中,我包含了一个名为 TTBaseUIKitExample 的基础项目,它提供了 BaseUIViewController、BaseUITableViewController、BaseCollectionViewController 等 UIKit 中的基础类,以及 SwiftUI 中的 BaseView、BaseButton、BaseText、BaseStack 等的全面示例。 理解这一点的最简单和最直接的方法是下载示例并运行它。 实践是最好的理解方式。

您可以在这里查看更多详细信息:TTBaseUIKit - TTBaseUIKitExample

安装

Swift Package Manager

  1. File > Swift Packages > Add Package Dependency (文件 > Swift Packages > 添加 Package 依赖)
  2. 添加 https://github.com/tqtuan1201/TTBaseUIKit.git
  3. 选择 "Up to Next Major" (直到下一个主要版本),版本为 "2.1.0" 或更高

一旦你设置好了 Swift 包,添加 Alamofire 作为依赖就像把它添加到你的 Package.swiftdependencies 值一样简单。

dependencies: [
    .package(url: "https://github.com/tqtuan1201/TTBaseUIKit.git", .upToNextMajor(from: "2.1.0"))
]
or 
dependencies: [
    .package(url: "https://github.com/tqtuan1201/TTBaseUIKit.git", branch: "master"),
]

如果您在向 Xcode 项目添加软件包时遇到任何问题或有疑问,我建议阅读 Apple 的添加 Package 依赖到您的 App 指南文章。

CocoaPods

CocoaPods 是 Cocoa 项目的依赖管理器。 将以下行添加到您的 Podfile 中

pod 'TTBaseUIKit'

Carthage

将以下行添加到您的 Cartfile 中

github "tqtuan1201/TTBaseUIKit"

手动

  1. 将 TTBaseUIKit 仓库放在您项目目录中的某个位置。
  2. 在 Xcode 中,将 TTBaseUIKit.xcodeproj 添加到您的项目中。
  3. 在您的应用程序的目标中,添加 TTBaseUIKit 框架
    1. 作为 General (常规) 选项卡上的嵌入式二进制文件。
    2. 作为 Build Phases (构建阶段) 选项卡上的目标依赖项。

基本配置设置

当您使用此框架时,您可以控制 Color(颜色)、FontSize(字体大小)、UI size(UI 大小)。 当您应用 主题、在 不同平台 上构建应用程序时,它可以帮助您很多,并且它们很容易更改。 在 AppDelegate 中配置设置

let view:ViewConfig = ViewConfig()
view.viewBgNavColor = UIColor.blue
view.viewBgColor = UIColor.white
view.buttonBgDef = UIColor.blue
view.buttonBgWar = UIColor.red

let size:SizeConfig = SizeConfig()
size.H_SEG = 50.0
size.H_BUTTON = 44.0

let font:FontConfig = FontConfig()
font.HEADER_H = 16
font.TITLE_H = 14
font.SUB_TITLE_H = 12
font.SUB_SUB_TITLE_H = 10

TTBaseUIKitConfig.withDefaultConfig(withFontConfig: font, frameSize: size, view: view)?.start(withViewLog: true)

self.window = UIWindow(frame: UIScreen.main.bounds)
self.window!.rootViewController = UINavigationController.init(rootViewController: YourViewController())
self.window!.makeKeyAndVisible()

应用配置通过

TTBaseUIKitConfig.withDefaultConfig(withFontConfig: font, frameSize: size, view: view)?.start(withViewLog: true)

用法

TTBaseUIKit 极大地简化了编写程序化构建 UI 的过程。 让我们快速看一些例子,使用 Swift 中的 TTBaseUIKit

界面定制

显示消息

let noti:TTBaseNotificationViewConfig = TTBaseNotificationViewConfig(with: window)
noti.setText(with: "WELCOME ^^", subTitle: "Just demo little element ui with write by  programmatically swift")
noti.type = .NOTIFICATION_VIEW
noti.touchType = .SWIPE
noti.notifiType = .SUCCESS
noti.onShow()

显示弹出窗口

let popupVC = TTPopupViewController(title: "SOMETHING LIKE THIS", subTitle: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has b", isAllowTouchPanel: true)
yourVC.present(popupVC, animated: true)

为表视图显示空白

yourVC.tableView.setStaticBgNoData(title: "NO DATA", des: "Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making ") {
  print("Touch handle!!!!")
            }

ViewCodable

这是一个用于轻松组织 UI 处理代码的 protocol(协议)。 您可以在此处查看所有配置:ViewCodable

基础 UIViews

自定义视图

import TTBaseUIKit

class YourCustomView : TTBaseUIView {
    override func updateBaseUIView() {
        super.updateBaseUIView()
    }
}

extension YourCustomView :TTViewCodable {

    func setupStyles() {
    }

    func setupCustomView() {
    }

    func setupConstraints() {
    }

}

BaseUIViewController

import  TTBaseUIKit

class BaseUIViewController: TTBaseUIViewController<DarkBaseUIView> {

    var lgNavType:BaseUINavigationView.TYPE { get { return .DEFAULT}}
    var backType:BaseUINavigationView.NAV_BACK = .BACK_POP

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(true)
        self.updateForNav()
    }

    public override init() {
        super.init()
        self.navBar = BaseUINavigationView(withType: self.lgNavType)
        self.setDelegate()
    }

    public convenience init(backType:BaseUINavigationView.NAV_BACK) {
        self.init()
        self.backType = backType
    }

    public convenience init(withTitleNav title:String, backType:BaseUINavigationView.NAV_BACK = .BACK_POP) {
        self.init()
        self.backType = backType
        self.setTitleNav(title)
    }

    public convenience init(withNav nav:BaseUINavigationView, backType:BaseUINavigationView.NAV_BACK = .BACK_POP) {
        self.init()
        self.backType = backType
        self.navBar = nav
        self.setDelegate()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}

// MARK: For private base funcs
extension BaseUIViewController {

    fileprivate func setDelegate() {
        if let lgNav = self.navBar as? BaseUINavigationView { lgNav.delegate = self }
    }

    fileprivate func updateForNav() {
        if let lgNav = self.navBar as? BaseUINavigationView {
            lgNav.setTitle(title: "TTBASEUIVIEW_KIT")
        }
    }
}

// MARK: For public base funcs
//--NAV
extension BaseUIViewController {

    func setTitleNav(_ text:String) {
        self.navBar.setTitle(title: text)
    }

    func setShowNav() {
        self.statusBar.isHidden = false
        self.navBar.isHidden = false
    }

    func setHiddenNav() {
        self.statusBar.isHidden = true
        self.navBar.isHidden = true
    }

}

extension BaseUIViewController :BaseUINavigationViewDelegate {
    func navDidTouchUpBackButton(withNavView nav: BaseUINavigationView) {
        if self.backType == .BACK_POP {
            self.navigationController?.popViewController(animated: true)
        } else if self.backType == .BACK_TO_ROOT {
            self.navigationController?.popToRootViewController(animated: true)
        } else {
            self.dismiss(animated: true, completion: nil)
        }
    }
    func navDidTouchUpRightButton(withNavView nav: BaseUINavigationView) {

    }
}

BaseUITableViewController

import TTBaseUIKit

class BaseUITableViewController: TTBaseUITableViewController {

    override var navType: TTBaseUIViewController<TTBaseUIView>.NAV_STYLE { get { return .STATUS_NAV}}

    var lgNavType:BaseUINavigationView.TYPE { get { return .DEFAULT}}
    var backType:BaseUINavigationView.NAV_BACK = .BACK_POP

    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)
        DispatchQueue.main.async { [weak self] in guard let strongSelf = self else { return }
            guard let headerView = strongSelf.tableView.tableHeaderView else { return }
            headerView.layoutIfNeeded()
            let header = strongSelf.tableView.tableHeaderView
            strongSelf.tableView.tableHeaderView = header
        }
    }


    override func updateBaseUI() {
        super.updateBaseUI()
        self.navBar = BaseUINavigationView(withType: self.lgNavType)
        self.setDelegate()
    }

}


//For Base private funcs
extension BaseUITableViewController : BaseUINavigationViewDelegate{

    fileprivate func setDelegate() {
        if let lgNav = self.navBar as? BaseUINavigationView { lgNav.delegate = self }
    }

    func navDidTouchUpBackButton(withNavView nav: BaseUINavigationView) {
        self.navigationController?.popViewController(animated: true)
    }
}

自动布局

TTBaseUIKit 使自动布局变得容易。 此框架提供了一些用于设置和更新约束的函数。

有用的功能

TTBaseUIKit 提供了 String(字符串)、Date(日期)、Json(JSON)、Device(设备)、Language(语言)、VietNamLunar(越南农历)、Validation(验证)、NetworkSpeedTest(网络速度测试)的常用处理函数

TTBaseUIKit 已经集成了 SwiftUI

借助 SwiftUI,Apple 为开发人员提供了一个统一的 UI 框架,用于在所有类型的 Apple 设备上构建用户界面。

TTBaseSUISpacer

在 SwiftUI 中,Spacer 视图主要用于布局和间距目的,它没有直接的属性来更改背景颜色或设置圆角半径。 但是,我们可以创建一个自定义类来添加一些常用的函数。

示例应用程序

有关更多示例和用法,请参考示例项目 TTBaseUIKitExample

TTBaseUIKitExample,它提供了 BaseUIViewController、BaseUITableViewController、BaseCollectionViewController 等 UIKit 中的基础类,以及 SwiftUI 中的 BaseView、BaseButton、BaseText、BaseStack 等的全面示例。 理解这一点的最简单和最直接的方法是下载示例并运行它。

已安装的应用程序

在我的工作中,我已经在许多项目中更新和使用了这个框架。 我的所有项目都使用 UI programmatically(UI 编程式),而不是使用 Storyboard。 以下是一些应用程序的屏幕截图

您可以在这里查看我所有的项目:链接

优点

缺点

关于

Truong Quang Tuan – 网站 – (电子邮件: truongquangtuanit@gmail.com)

你好,我是 Tuan (Quang-Tuan Truong 的简称)。 我是一名移动负责人,拥有多年的专业经验,在大公司和小型创业公司中构建应用程序和领导团队。

如果您有任何建议、问题或其他任何事情,请随时与我联系。 您可以通过电子邮件 truongquangtuanit@gmail.com 或通过我的网站联系我:https://tqtuan1201.github.io/

认识我的团队

如果您有一个很棒的想法,但不知道如何开始? 不用担心,只需单击认识我的团队,我们就可以一起喝咖啡讨论您的项目

我们构建高质量的应用程序! 如果您在项目中需要帮助,请联系我们