[Android开发学iOS系列] iOS写UI的几种方式
[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的几种方式的更多相关文章
- Android开发之使用sqlite3工具操作数据库的两种方式
使用 sqlite3 工具操作数据库的两种方式 请尊重他人的劳动成果,转载请注明出处:Android开发之使用sqlite3工具操作数据库的两种方式 http://blog.csdn.net/feng ...
- Android:在子线程中更新UI的三种方式
①使用Activity中的runOnUiThread(Runnable) ②使用Handler中的post(Runnable) 在创建Handler对象时,必须先通过Context的getMainLo ...
- [Android开发学iOS系列] Auto Layout
[Android开发学iOS系列] Auto Layout 内容: 介绍什么是Auto Layout. 基本使用方法 在代码中写约束的方法 Auto Layout的原理 尺寸和优先级 Auto Lay ...
- [Android开发学iOS系列] 工具篇: Xcode使用和快捷键
[Android开发学iOS系列] 工具篇: Xcode使用和快捷键 工欲善其事必先利其器. 编辑 Cmd + N: 新建文件 Option + Cmd + N: 新建文件夹 Cmd + / : 注释 ...
- Android开发—智能家居系列】(二):用手机对WIFI模块进行配置
在实际开发中,我开发的这款APP是用来连接温控器,并对温控器进行控制的.有图为证,哈哈. 上一篇文章[Android开发—智能家居系列](一):智能家居原理的文末总结中写到: 手机APP控制智能温控器 ...
- Android开发之手把手教你写ButterKnife框架(三)
欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52672188 本文出自:[余志强的博客] 一.概述 上一篇博客讲了, ...
- Android开发之手把手教你写ButterKnife框架(二)
欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52664112 本文出自:[余志强的博客] 上一篇博客Android开 ...
- Android开发怎么让自己的APP UI漂亮、大方(配色篇二)
我们在没有效果图的app开发中有一件事情肯定很头疼:一个按钮的调色改过来改过去,还是很难看,最终只能暂时作罢,浪费了大量的开发时间和精力.开发规范篇见Android开发怎么让自己的APP UI漂亮.大 ...
- Android开发怎么让自己的APP UI漂亮、大方(规范篇一)
首先,笔者是站立在开发者的角度来看UI设计的,欢迎专业人士提供指导,不多说,来看怎么把UI设计和开发高效结合起来~ 一.约定APP开发中的一些规则 1.大部分图标满足HDPI(高清)即可,比如:大众点 ...
随机推荐
- gitpod.io,云端开发调试工具。
gitpod,一款在线开发调试工具,使用它你可以在网页上直接开发软件项目了. 比如你的项目仓库在github上,你可以直接在网址的前面添加gitpod.io/#,然后回车就能在网页上使用vscode打 ...
- doc或docx(word)或image类型文件批量转PDF脚本
doc或docx(word)或image类型文件批量转PDF脚本 1.实际生产环境中遇到文件展示只能适配PDF版本的文件,奈何一万个文件有七千个都是word或者image类型的,由此搞个脚本批量转换下 ...
- MySQL通配符与正则表达式
通配符 通配符必须全文匹配时才为真,使用LIKE关键字 字符 示例 含义 _ "a_b" 任意一个字符"axb",其中x可以使任意字符,包括汉字 % " ...
- my2sql工具之快速入门
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. GreatSQL是MySQL的国产分支版本,使用上与MySQL一致. my2sql工具之快速入门 1.什么是my2sql ...
- Flutter 实战(一):列表项内容可自定义的列表组件
前言 本篇文的目的是熟练掌握 Flutter 组件的封装,并且使用回调函数实现主要功能. 本组件的设计灵感来源于 Element 组件库的 table 组件. 正题 定义回调函数 在此之前,必须要了解 ...
- oracle 怎么查看用户对应的表空间
oracle 怎么查看用户对应的表空间? 查询用户: 查看数据库里面所有用户,前提是你是有 dba 权限的帐号,如 sys,system: select * from dba_users; 查看你能管 ...
- PHP极简短连接
可用于短连接开发 随便找个PHP空间存放即可 点击查看代码 <html> <head> <meta charset="utf-8"/> < ...
- SpringMvc请求流程源码解析
目录 SpringMvc请求流程图 请求流程粗讲解 方法细讲 doDispatcher --> 核心 找到Handler#getHandler getHandler(request) mappi ...
- atcoder beginner contest 251(D-E)
Tasks - Panasonic Programming Contest 2022(AtCoder Beginner Contest 251)\ D - At Most 3 (Contestant ...
- django_day07
django_day07 django form组件 form组件的定义 class RegForm(forms.Form): user = forms.CharField(label='用户名') ...