[Android开发学iOS系列] iOS写UI的几种方式

作为一个现代化的平台, iOS的发展也经历了好几个时代.

本文讲讲iOS写UI的几种主要方式和各自的特点.

iOS写UI的方式

在iOS中写UI有多种选择, 大的分类: 使用UIKit还是SwiftUI.

在使用UIKit的情形下, 还根据是否使用storyboard来区分.

  • UIKit:

    • 用storyboard.也叫Interface Builder.
    • 采用代码来写UI, 手写约束.
  • SwiftUI.

注意: 以上的几种方式在项目里可能是混合使用的, 所以建议都了解.

UIKit

UIKit是苹果官方的framework, 其中包含了UI组件和各种基础设施支持, 是传统的iOS开发离不开的一套类库.

UIViewController就属于UIKit.

用Storyboard

我们新建的项目, 如果不选SwiftUI, 都会带一个main storyboard.

用Storyboard写UI大致分为这几步:

  • 在Storyboard中添加控件. 用Cmd + Shift + L可以呼出菜单. 可以添加View或者新的View Controller.
  • 设置属性, 约束. (侧面面板, 右下角约束按钮, 以及Ctrl+拖拽生成相对约束).
  • 需要有在代码中的交互:
    • 显示Assistant View之后将对应的ViewController类代码同时显示出来.
    • Ctrl + 拖拽 生成outlet(用于控制控件本身属性)或者action(控件的点击事件).

(这一步也不是必须这样做, 也可以先手写出outlet代码, 然后拖拽连起来.)

优点:

  • 图形界面编辑.
  • 可以不用build看到UI预览效果.

缺点: 因为代码是一个xml文件中track, 在团队合作容易产生不好解决的冲突.

用代码写View和约束(不用Storyboard)

首先, 在loadView()中设置view:

override func viewDidLoad() {
super.viewDidLoad() view = UIView()
view.backgroundColor = .white
}

然后不断地addSubview()进去.

其中子view可以是controller中声明的字段:

var myLabel: UILabel!

这里加上感叹号有kotlin中类似lateinit的作用, 否则会提示controller没有init方法.

之后再添加Constraints.

优点: 都用代码写, 历史清晰, 冲突好解决.

缺点: 要用代码写约束; 写起来比较啰嗦; 运行之后才能看到实际的效果.

SwiftUI

SwiftUI是iOS新推出的声明式的写UI的方式, 可以类比Android的Jetpack Compose.

新建项目以后的Hello World大概长这样:

App:

import SwiftUI

@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}

ContentView:

import SwiftUI

struct ContentView: View {
var body: some View {
Text("Hello, world!")
.padding()
}
} struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}

优点:

  • 最新的技术, 符合未来发展的潮流(类比Compose, Flutter, React Native).
  • 使用方便简单, 易上手.
  • Xcode的预览和编辑功能都支持得不错, 可以在属性面板上直接添加或者编辑属性, 有代码自动联动.
  • 可以和UIKit的老代码互操作, 兼容良好.

缺点:

  • 要求OS版本13及以上.
  • 因为整体的设计思路变为了functional programming, 所以旧代码迁移需要做一些设计方面的思维转换, 并不是替换了一套UI库这么简单.
  • 如何说服团队使用.

[Android开发学iOS系列] iOS写UI的几种方式的更多相关文章

  1. Android开发之使用sqlite3工具操作数据库的两种方式

    使用 sqlite3 工具操作数据库的两种方式 请尊重他人的劳动成果,转载请注明出处:Android开发之使用sqlite3工具操作数据库的两种方式 http://blog.csdn.net/feng ...

  2. Android:在子线程中更新UI的三种方式

    ①使用Activity中的runOnUiThread(Runnable) ②使用Handler中的post(Runnable) 在创建Handler对象时,必须先通过Context的getMainLo ...

  3. [Android开发学iOS系列] Auto Layout

    [Android开发学iOS系列] Auto Layout 内容: 介绍什么是Auto Layout. 基本使用方法 在代码中写约束的方法 Auto Layout的原理 尺寸和优先级 Auto Lay ...

  4. [Android开发学iOS系列] 工具篇: Xcode使用和快捷键

    [Android开发学iOS系列] 工具篇: Xcode使用和快捷键 工欲善其事必先利其器. 编辑 Cmd + N: 新建文件 Option + Cmd + N: 新建文件夹 Cmd + / : 注释 ...

  5. Android开发—智能家居系列】(二):用手机对WIFI模块进行配置

    在实际开发中,我开发的这款APP是用来连接温控器,并对温控器进行控制的.有图为证,哈哈. 上一篇文章[Android开发—智能家居系列](一):智能家居原理的文末总结中写到: 手机APP控制智能温控器 ...

  6. Android开发之手把手教你写ButterKnife框架(三)

    欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52672188 本文出自:[余志强的博客] 一.概述 上一篇博客讲了, ...

  7. Android开发之手把手教你写ButterKnife框架(二)

    欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52664112 本文出自:[余志强的博客] 上一篇博客Android开 ...

  8. Android开发怎么让自己的APP UI漂亮、大方(配色篇二)

    我们在没有效果图的app开发中有一件事情肯定很头疼:一个按钮的调色改过来改过去,还是很难看,最终只能暂时作罢,浪费了大量的开发时间和精力.开发规范篇见Android开发怎么让自己的APP UI漂亮.大 ...

  9. Android开发怎么让自己的APP UI漂亮、大方(规范篇一)

    首先,笔者是站立在开发者的角度来看UI设计的,欢迎专业人士提供指导,不多说,来看怎么把UI设计和开发高效结合起来~ 一.约定APP开发中的一些规则 1.大部分图标满足HDPI(高清)即可,比如:大众点 ...

随机推荐

  1. 获取字典中values值中最大的数,返回对应的keys

    1.字典中键值对的获取 print(data.values()) # 查看字典的值 print(data.keys()) # 查看字典的key 2.对字典中的值进行排序 sorted(data.val ...

  2. List的同步类比较

    TL;NRs CopyOnWriteArrayList类在多线程顺序读取上有很大的优势,但在随机读取上反而有较大的劣势,且在写入方面性能极差. Vector类在顺序读取方面性能较差,但在随机读取方面有 ...

  3. Java反射原理和实际用法

    背景 反射在Java中非常重要,是Java区别于其他编程语言的一大特性.Java中的AOP切面.动态代理等看起来像黑魔法一样的技术,就离不开反射.字节码等.这些技术能在不侵入原有代码的情况下,做一些增 ...

  4. 解决linux下U盘变成只读模式

    在最近的一个项目里,需要将linux下的些文件拷贝出来.插入U盘后,发现是只读模式. U盘可以写出,不能写入. 折腾了一翻: 最后这样解决的: 将U盘插入到windows下 执行 chkdsk g: ...

  5. Node.js + Express + Knex 开发 API 接口

    安装依赖包 npm i express knex mysql2 这是 Knex 官方文档地址:Knex.js - SQL query builder. 搭建接口 config.js 新建一个 conf ...

  6. Learn Dijkstra For The Last Time

    博客链接:https://www.codein.icu/learn-dijkstra/ Introduction Dijkstra 算法是用于求解非负权图单源最短路的经典算法. 市面上的大部分教程都仅 ...

  7. 学军中学第三届“图灵杯”趣味网络邀请赛——中级T4.欧拉回路 (图论,哈希)

    题面 补题链接 7 5 6 7 1 2 3 3 13 5 30 50 10 30 70 8 题解 存在欧拉回路的条件是:1. 每个点的度数都是偶数.2. 有边的连通块最多一个. 数据范围是允许我们 n ...

  8. 关于使用docker volume挂载的注意事项

    Content 在用Docker进行持久化的存储的时候,有两种方式: 使用数据卷(volume) -v 容器绝对路径 或者 -v 已经创建的volume名称:容器绝对路径 2. 使用挂载点(共享宿主目 ...

  9. Helm安装ingress-nginx-4.1.4

    Application version 1.2.1 Chart version 4.1.4 获取chart包 helm fetch ingress-nginx/ingress-nginx --vers ...

  10. HTTP2指纹识别(一种相对不为人知的网络指纹识别方法)

    这是关于网络指纹识别的两部分系列的第二部分 上一部分我介绍了有关TLS 指纹识别方法(以及在不同客户端的指纹有何区别): https://mp.weixin.qq.com/s/BvotXrFXwYvG ...