介绍几个我在开发健康笔记2用到的Swift或SwiftUI第三方库

SwiftUIX

SwiftUIX试图弥补仍处于新生阶段的SwiftUI框架的空白,提供了广泛的组件,扩展和实用程序套件来补充标准库。 迄今为止,该项目是缺少的UIKit / AppKit功能的最完整的移植,力求使其以大多数类似于Apple的方式交付。
这个项目的目标是补充SwiftUI标准库,提供数百种扩展和视图,使开发人员可以轻松地通过SwiftUI的革命来构建应用程序。

提供了非常多的苹果本应提供但没有提供的功能扩展。项目的发起者非常年轻,但mac的开发经验十分丰富。到目前为止一直保持的较高的更新频率和维护状态。这个库同时支持UIKit和Appkit,对于需要做苹果生态全平台的用户十分友好。由于目前SwiftUI的List和LazyVStack的问题还很多,他自己在开发中也深受其苦,前天在交流中,他已经决定重做CocoaList功能,尤其提高对Fetchrequest的支持。

对于进行SwiftUI开发的朋友,它是十分值得推荐的。

目前的问题是文档太少。不过对我来说也未尝不是一个好事。在研究它的用法过程中,给了我更多的机会阅读并学习它的代码,对SwiftUI,UIkit等有了更多的认识和了解。

Charts

denielgindi对著名的安卓图表库 MPAndroidChart的Swift移植。是目前不多的纯Swift解决方案。它的优势也是同时支持UIKit和Appkit,同时提供了不错的Demo社区活跃度。

不过他的开发者好像不打算在3.x版本上在增加太多的功能,非常多目前急需并且已有解决方案的功能并没有被当前版本接受。所以整体的视觉呈现还是比较传统的。社区上对于功能的讨论不少,但合并的极少,4.0的版本好像也已经开发了不短的时间了,不过进度好像也不是特别理想。

从效率上讲,Charts应该是非常合格的了。

航歌 上面有非常详细的中文使用教程,对我的学习帮助很大。

为了健康笔记开发的需要,我在当前3.6的版本上合并了两个社区上较为成熟的解决方案:

  • 圆角Bar

    dataSet.roundedCorners = [.topLeft,.topRight]
    
  • 渐变色Bar

    dataSet.drawBarGradientEnabled = true
                dataSet.colors = [UIColor(named: "barColor1")!, UIColor(named: "barColor1")!, UIColor(named: "barColor2")!]
                dataSet.gradientPositions = [0, 40, 100]
    

由于当前的Charts本身并不支持对于图表滚动后停止事件的响应,我自己为它增加了停止响应。

                //滚动终止时调用
        func chartScrollStop(_ chartView:ChartViewBase){
            print("stopped")
        }

修改后的代码在此可以获得

Introspect

Introspect允许您获取SwiftUI视图的基础UIKit或AppKit元素。
例如,使用Introspect,您可以访问UITableView来修改分隔符,或访问UINavigationController来自定义选项卡栏。

有一个非常推荐的利器。目前官方对于SwiftUI中的控件提供的可控选项很少,如果想做一些深度定制的话,通常就是自己写代码来重新包装UIkit控件。不过introspect提供了一个非常巧妙的办法通过简单的注入方式便可以对SwiftUI控件做更多的调整。

比如:

只有当内容超出显示范围才进行滚动

ScrollView{
    ....
}
.introspectScrollView{ scrollView in
        crollView.isScrollEnabled = scrollView.contentSize.height > scrollView.frame.height
               }

显示TextField的clear按钮

TextField("note_noteName",text: $myState.noteName)
          .introspectTextField{ text in
             text.clearButtonMode = .whileEditing
           }

对于新的控件它本身还没提供具体支持的也可以方便的注入

修改SwiftUI2.0中新提供的TextEditor背景色

TextEditor(text: $text)
                .introspect(selector: TargetViewSelector.sibling){ textView in
                    textView.backgroundColor = .clear
                }

等等。类似的用法在我整个的开发中的使用频率是很高的。

SwiftDate

使用Swift编写的时间日期处理库。同时支持苹果平台以及Linux。

它提供了非常详尽的文档,航哥上也有非常好的中文教程。

由于健康笔记需要对数据进行不少处理,尤其是需要将相同时间粒度的数据进行合并比较。SwiftDate提供的Region方案提供了完美的解决途径。

在SwiftDate中,我多数使用它提供的DateInRegion来处理日期。通过

SwiftDate.defaultRegion = region

我几乎无需关心日期的本地化问题。而且它也提供了部分的日期时间的本地化显示方案(但并不完美)。

一些使用举例:

除非用户在app中设定了特定的时区,否则使用当前设备的默认设置:

if let data = UserDefaults.standard.data(forKey: "dateRegion"),
           let region = try? JSONDecoder().decode(Region.self, from: data) {
            SwiftDate.defaultRegion = region
        }
        else {
            SwiftDate.defaultRegion = Region(calendar: Calendars.gregorian, zone: Zones.current, locale: Locales.current)
        }

判断某个日期和指定日期的天数差(本地时区):

let startDate = DateInRegion(datas.first!.viewModel.date1).dateTruncated(at: [.hour,.minute,.second])!
duration = date.difference(in: .day, from: startDate) ?? 0

如果你的程序需要对日期进行频繁的处理或者有较多的本地化需求时,SwiftDate是非常好的选择!

SwiftUIOverlayContainer

SwiftUIOverlayContainer本身并不提供任何预置的视图样式,不过通过它,你有充分的自有度来实现自己需要的视图效果。OverlayContainer的主要目的在于帮助你完成动画、交互、样式定制等基础工作,使开发者能够将时间和精力仅需投入在视图本身的代码上。

这是我自己写的一个库,这次通过它实现的屏幕侧边滑动菜单。

本来它的用途主要不是做这个的,暂时使用它来完成侧向滑动菜单也是权宜之计,表现尚可。

ZIPFoundation

ZIP Foundation是一个用于创建,读取和修改ZIP存档文件的库。
它是用Swift编写的,基于Apple的libcompression来实现高性能和高能效。

小巧、高效,使用便捷。健康笔记在数据导入导出时,使用它来完成zip文件的操作。

比如解压备份数据:

//打开沙盒读取权限
   _ = url.startAccessingSecurityScopedResource() 
//解压
   do {
      try FileManager.default.unzipItem(at: url, to: URL(fileURLWithPath: NSTemporaryDirectory()))
        }
        catch {
          
        }

MarkdownView

基于WKwebView实现的Markdown文件Viewer。对md的解析是通过调用js库来完成的。

由于SwiftUI的Text文本排版能力几乎为零,因此我选择使用md格式来保存app所需的一些文字显示,比如隐私政策等。

MarkdownView的渲染效率一般,但我的显示需求并不大,所以感觉不明显。但它的开发者对js文件进行了加扰处理,所以如果你想对其中它所调用的例如mardown-it进行更多配置的话,就几乎不可能了。

另外,通过UIViewRepresentable对其进行封装,在SwiftUI下是无法正确获取frame的尺寸的,从而无法正确显示。我对于UIkit所知甚少,只能做了最简单的修改,勉强让其可以在SwiftUI下完成所需要的功能。

修改后的版本可在这里下载

另外,我在UIViewRepresentable包装中增加了一些简单的修改,使其可以方便的将md中的图片,替换成Bundle中的本地图片。

调用代码 下载

ExcelExport

生成XSL文件的Swift代码。

这段代码有一段时间了,不过去年又做了更新,不过我感觉更新后的版本还不如之前的。但它的新版本不支持Date的字段导出,老版本导出的Date字段格式在Excel中也有问题。我合并了两个版本,并且让其在命名上对SwiftUI更加友好。

修改后的代码 下载

必须对日期做如下处理,日期字段才能被Excel顺利识别

 let date = DateInRegion(memo.viewModel.date).toFormat("yyyy-MM-dd")
 let time = DateInRegion(memo.viewModel.date).toFormat("HH:mm:ss.FFF")
 let dateCell = ExcelCell(date + "T" + time,type: .dateTime)

上述的库都被使用在 健康笔记2.0 中。如想查看更多的演示,可以移步

健康笔记2.0 使用SwiftUI2.0开发的iOS app

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351