用 SwiftUI 五天组装一个微信
GitHub 链接:SwiftUI-WeChatDemo
效果图

实装内容
- 4 个 Tab 页面 + 聊天界面,使用纯 SwiftUI 搭建而成
- 应用启动界面 Launch Screen
- 国际化及应用内语言切换功能
- Combine 使用场景(聊天界面简易对话功能)
- 极度简化的 MVVM 架构
- 逻辑部分纯 Swift5 书写,几乎不涉及 OC 类及 UIKit 库
- 不使用第三方框架(除了 SwiftGen 提供便利)
难点
- 在聊天界面中隐藏 Tabbar(未能实现)
- 聊天界面中信息滚动功能,尤其动画滑动效果难以实现
- 保持键盘焦点,不自动隐藏(有望在 SwiftUI 3 后实现)
- 发现页图标的动态颜色指定(实现起来障碍较大,多番尝试发现无法简单地将 Color 和 一众渐变色类型 存储到单一变量,并且 View 比较难以扩展,语法糖副作用严重)
- SwiftUI 原生视图难以完美复刻微信原生界面(尤其是联系人页),判断是微信使用了大量自定义视图
- Tab 按钮添加红点(无法实现,SwiftUI 原生视图仅接受 Image 和 Text,对 Modifier 的修改直接忽略)
- SwiftUI 中 Combine 的使用(通过 ObservableObject 构造 ViewModel 实现)
- 应用内语言切换(通过 自定义配置 SwiftGen 实现)
坑
- SwiftUI2 中缺乏视图焦点控制方法(该部分将在 SwiftUI3 中提供)
- SwiftUI 中使用 switch 语法时,会导致自动提示失效,但编译能顺利通过,判断是 Xcode 问题
- 目前在书写 SwiftUI 时遇到语法使用错误等情况,偶尔会出现 Xcode 提示未知错误,建议报告 bug(因为逐行书写,基本都能猜出问题所在)
彩蛋
应用内包含微信联系方式,欢迎同行交流(本人是 Android 攻城狮..)
用 SwiftUI 五天组装一个微信的更多相关文章
- 剖析:如何用 SwiftUI 5天组装一个微信 —— 通讯录发现我篇
前置资源 GitHub: SwiftUI-WeChatDemo 第零章:用 SwiftUI 5天组装一个微信 第一章:剖析:如何用 SwiftUI 5天组装一个微信 -- 聊天界面篇 通讯录 通讯录的 ...
- 剖析:如何用 SwitchUI 5天写一个微信 —— 聊天界面篇
前置资源 GitHub: SwiftUI-WeChatDemo 第零章:用 SwiftUI 五天组装一个微信 - wavky - 博客园 整体结构 UI 部分代码分布如上图所示,App 的主入口类为 ...
- 领导让我重新做一个微信H5页面!
leader:我们需要做一个微信H5页面,效果如图,功能如描述,时间越快越好. 需求是不是很简单呢?2015-11-24 12:44:00文末有最新更新 背景描述 前几天微信转发相关项目开发后,这是第 ...
- 如何快速地开发一个微信小程序
如何快速地开发一个微信小程序呢?我觉得作为初学者,最好能有一个模板,然后改这个模板. 同样作为初学者,刚开始的时候我有下面的几个问题,后来通过问同学,我弄清楚了. 微信小程序可以连接MySQL或者Sq ...
- QML学习笔记(五)— 做一个简单的待做事项列表
做一个简单的QML待做事项列表,能够动态添加和删除和编辑数据 GitHub:八至 作者:狐狸家的鱼 本文链接:QML学习笔记(五)— 做一个待做事项列表 主要用到QML:ListView 效果 全部代 ...
- phantomjs + python 打造一个微信机器人
phantomjs + python 打造一个微信机器人 1.前奏 媳妇公司不能上网,但经常需要在公众号上找一些文章做一些参考,需要的时候就把文章链接分享给我,然后我在浏览器打开网页,一点点复制过 ...
- 微信公众平台开发 - 动手篇。使用weinxinFundation开始一个微信公众平台的开发
本文主要讲解如何使用 weinxinFundation 进行二次开发. 步骤如下: 1.创建新的web项目. 在eclipse里新建一个dynamicly web project,比如本文叫weixi ...
- 纯CSS实现一个微信logo,需要几个标签?
博客已迁移至http://lwzhang.github.io. 纯CSS实现一个微信logo并不难,难的是怎样用最少的html标签实现.我一直在想怎样用一个标签就能实现,最后还是没想出来,就只好用两个 ...
- 如何开发一个微信小程序
一.概述 特点:对商家来说,小程序的开发成本低(有丰富的组件.api等).运营成本低(有数据日志等).稳定.互动流畅,便于分享.传播(基本微信平台的大量用户).对用户来说,扫码即可获取服务,随 ...
随机推荐
- Django(49)drf解析模块源码分析
前言 上一篇分析了请求模块的源码,如下: def initialize_request(self, request, *args, **kwargs): """ Retu ...
- 将视频插入视频:CVPR2019论文解析
将视频插入视频:CVPR2019论文解析 Inserting Videos into Videos 论文链接: http://openaccess.thecvf.com/content_CVPR_20 ...
- FCN与U-Net语义分割算法
FCN与U-Net语义分割算法 图像语义分割(Semantic Segmentation)是图像处理和是机器视觉技术中关于图像理解的重要一环,也是 AI 领域中一个重要的分支.语义分割即是对图像中每一 ...
- Xshell6会话管理器无意中关闭,在哪里打开
一.进入查看 二.勾选则弹出,然后双击窗口即可
- Android客户端网络预连接优化机制探究
一.背景 一般情况下,我们都是用一些封装好的网络框架去请求网络,对底层实现不甚关注,而大部分情况下也不需要特别关注处理.得益于因特网的协议,网络分层,我们可以只在应用层去处理业务就行.但是了解底层的一 ...
- UF_LAYOUT 布局相关
Open C uc6460uc6462uc6463uc6464 根据视图名称旋转视图,在布局中替换视图uc6466uc6467uc6468uc6469uc6470uc6471uc6472uc6473
- 【NX二次开发】缝合片体例子UF_MODL_create_sew
缝合片体,没有成功缝合的片体涂绿色. 效果: 源码: extern DllExport void ufusr(char *param, int *returnCode, int rlen) { UF ...
- .Net RabbitMQ实战指南——HTTP API接口调用
RabbitMQ Management插件还提供了基于RESTful风格的HTTP API接口来方便调用.一共涉及4种HTTP方法:GET.PUT.DELETE和POST.GET方法一般用来获取如集群 ...
- CVPR2021|一个高效的金字塔切分注意力模块PSA
前言: 前面分享了一篇<继SE,CBAM后的一种新的注意力机制Coordinate Attention>,其出发点在于SE只引入了通道注意力,CBAM的空间注意力只考虑了局部区域的信息 ...
- js笔记20
1.DOM零级事件元素绑定多个click,最后只执行最后一个click DOM二级事件绑定多个click,都要执行 注意当绑定的多个事件名,函数名,事件发生阶段三者完全一样时,才执行最后一个 第 ...