Flix 4.0.0

Flix 4.0.0

测试已测试
Lang语言 SwiftSwift
许可 MIT
Released最后发布2019 年 5 月
SPM支持 SPM

DianQK维护。



 
依赖
RxSwift~> 5.0
RxCocoa~> 5.0
RxDataSources~> 4.0
 

Flix 4.0.0

  • DianQK

Flix: iOS form builder in Swift

Travis CI CocoaPods compatible Carthage compatible 中文 README

Flix 是一个灵活的 iOS 框架,适用于使用 UITableViewUICollectionView 创建动态表单。

特性

  • 需要时,支持不重复使用。
  • 需要时,支持列表的重复使用。
  • 支持嵌套表单。
  • 支持添加、删除和插入。
  • 支持 Storyboard 设计。
  • 提供示例应用!
  • UITableViewUICollectionView 一起工作。

Flix 主要关注将 UICollectionViewUITableView 的单元格组合起来,它不关心视图布局或业务逻辑。因此,您可以使用 Flix 容易地构建自定义表单。

预览

需求

  • Xcode 10.2+
  • Swift 5+
  • RxSwift 5.0+
  • RxDataSources 4.0+

安装

CocoaPods

pod 'Flix', '~> 4.0'

Principle

每个供应商都会生成一定数量的节点(单元格),然后根据顺序将这些供应商组合起来。

教程 - 一个简单的设置页面

在创建设置页面时,我们不希望某些单元格被重复使用,例如“个人资料单元格”、“飞行模式单元格”。这看起来像在 Storyboard 中创建静态的 tableView。

要创建一个个人资料单元格,我们只需要创建一个 UniqueCustomTableViewProvider 并配置其样式并添加一些视图。

let profileProvider = UniqueCustomTableViewProvider()
profileProvider.itemHeight = { _ in return 80 }
profileProvider.accessoryType = .disclosureIndicator

let avatarImageView = UIImageView( image: #imageLiteral(resourceName: "Flix Icon") ) profileProvider.contentView.addSubview(avatarImageView)

let nameLabel = UILabel() nameLabel.text = "Flix" profileProvider.contentView.addSubview(nameLabel)

let subTitleLabel = UILabel() subTitleLabel.text = "Apple ID, iCloud, iTunes & App Store" profileProvider.contentView.addSubview(subTitleLabel)

self.tableView.flix.build([profileProvider])

现在,我们已经在设置页面中有了个人资料单元格,考虑到我们可能在另一个 UITableView 上使用此供应商。我们应该为 profileProvider 创建一个类。

我们可以从 UniqueCustomTableViewProvider 继承。

class ProfileProvider: UniqueCustomTableViewProvider {

    let avatarImageView = UIImageView()
    let nameLabel = UILabel()
    let subTitleLabel = UILabel()

    init(avatar: UIImage, name: String) {
        super.init()

        self.itemHeight = { _ in return 80 }
        self.accessoryType = .disclosureIndicator

        avatarImageView.image = avatar
        self.contentView.addSubview(avatarImageView)

        nameLabel.text = name
        self.contentView.addSubview(nameLabel)

        subTitleLabel.text = "Apple ID, iCloud, iTunes & App Store"
        self.contentView.addSubview(subTitleLabel)
    }

}

或者实现协议 UniqueAnimatableTableViewProvider

class ProfileProvider: UniqueAnimatableTableViewProvider {

    let avatarImageView = UIImageView()
    let nameLabel = UILabel()
    let subTitleLabel = UILabel()

    init(avatar: UIImage, name: String) {
        avatarImageView.image = avatar
        nameLabel.text = name
        subTitleLabel.text = "Apple ID, iCloud, iTunes & App Store"
    }

    func onCreate(_ tableView: UITableView, cell: UITableViewCell, indexPath: IndexPath) {
        cell.accessoryType = .disclosureIndicator
        cell.contentView.addSubview(avatarImageView)
        cell.contentView.addSubview(nameLabel)
        cell.contentView.addSubview(subTitleLabel)
    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath, value: ProfileProvider) -> CGFloat? {
        return 80
    }

}

但事实上,个人资料单元格被放置在一个部分中,我们可以使用 SectionProfiler

let profileSectionProvider = SpacingSectionProvider(
    providers: [profileProvider],
    headerHeight: 35,
    footerHeight: 0
)
self.tableView.flix.build([profileSectionProvider])

然后添加更多供应商。

let profileProvider = ProfileProvider(
    avatar: #imageLiteral(resourceName: "Flix Icon"),
    name: "Flix")
let profileSectionProvider = SpacingSectionProvider(
    providers: [profileProvider],
    headerHeight: 35,
    footerHeight: 0)
let airplaneModeProvider = SwitchTableViewCellProvider(
    title: "Airplane Mode",
    icon: #imageLiteral(resourceName: "Airplane"),
    isOn: false)
let wifiProvider = DescriptionTableViewCellProvider(
    title: "Wi-Fi",
    icon: #imageLiteral(resourceName: "Wifi"),
    description: "Flix_5G")
let bluetoothProvider = DescriptionTableViewCellProvider(
    title: "Bluetooth",
    icon: #imageLiteral(resourceName: "Bluetooth"),
    description: "On")
let cellularProvider = DescriptionTableViewCellProvider(
    title: "Cellular",
    icon: #imageLiteral(resourceName: "Cellular"))
let hotspotProvider = DescriptionTableViewCellProvider(
    title: "Personal Hotspot",
    icon: #imageLiteral(resourceName: "Personal Hotspot"),
    description: "Off")
let carrierProvider = DescriptionTableViewCellProvider(
    title: "Carrier",
    icon: #imageLiteral(resourceName: "Carrier"),
    description: "AT&T")
let networkSectionProvider = SpacingSectionProvider(
    providers: [
        airplaneModeProvider,
        wifiProvider,
        bluetoothProvider,
        cellularProvider,
        hotspotProvider,
        carrierProvider
    ],
    headerHeight: 35,
    footerHeight: 0
)
self.tableView.flix.build(
    [profileSectionProvider, networkSectionProvider]
)
    

到目前为止,我们只使用一个供应商生成一个单元格。我们也可以为单元格组创建一个供应商。

let appSectionProvider = SpacingSectionProvider(
    providers: [AppsProvider(apps: [
        App(icon: Wallet, title: "Wallet"),
        App(icon: iTunes, title: "iTunes"),
        App(icon: Music, title: "Music"),
        App(icon: Safari, title: "Safari"),
        App(icon: News, title: "News"),
        App(icon: Camera, title: "Camera"),
        App(icon: Photos), title: "Photo")
        ])],
    headerHeight: 35,
    footerHeight: 35
)
self.tableView.flix.build([
    profileSectionProvider,
    networkSectionProvider,
    appSectionProvider]
)
    

看起来不错。

实际上,Flix 支持更多的构建列表视图功能,您可以用它轻松地创建具有各种链接效果(如日历事件、GitHub 注册)的页面。更多示例可在 示例文件夹 中找到。

贡献

  1. 请复制此项目
  2. 实现新的方法或更改。
  3. 在 README.md 中编写合适的文档和注释。
  4. 提交一个 pull 请求。

联系

提出问题或通过Twitter联系我@Songxut

许可协议

Flix采用MIT许可协议发布。更多详细信息请参阅LICENSE。