[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. python type 与 metaclass理解

    简介 众所周知,type在一般情况下,我们都会去获取一个对象的类型,然后进行类型的比较:除此之外,type还有一个不为人知的作用:动态的创建类.在了解这个之前,首先了解以下type和isinstanc ...

  2. 特殊的阻塞队列 - java.util.concurrent.SynchronousQueue 分析

    描述 SynchrounousQueue 是一个比较特殊的无界阻塞队列并支持非公平和公平模式,严格意义上来说不算一个队列,因为它不像其他阻塞队列一样能有容量,它仅有一个指向栈顶的地址,栈中的节点由线程 ...

  3. JS for in / foreach / for of 超简单对照解释

    for in 可以遍历数组/对象/字符串/enumerable对象,得到的是索引,遍历对象时可以写这样 obj[index] 代表对象当前的属性foreach 只能遍历数组,不能遍历字符串.对象for ...

  4. Vue 搭建脚手架 && 脚手架的文件结构 && 关于不同版本的Vue

    1 # 一.Vue 环境搭建 2 # 1.VsCode 编码插件:Vuter 3 # 2.Vue 脚手架安装 4 # 1).安装:npm install -g @vue/cli or yarn glo ...

  5. AOP实现切入

    6.AOP实现切入 AOP为Aspect Oriented Programming的缩写,意为:面向切面编程 通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术 AOP是OOP的延续,也 ...

  6. 解决 idea无法下载源码 Sources not found for:XXX

    解决 idea无法下载源码 Sources not found for:XXX 命令行输入 mvn dependency:resolve -Dclassifier=sources 参考 https:/ ...

  7. Luogu1880 [NOI1995]石子合并 (区间DP)

    一个1A主席树的男人,沦落到褪水DP举步维艰 #include <iostream> #include <cstdio> #include <cstring> #i ...

  8. Java NIO全面详解(看这篇就够了)

    很多技术框架都使用NIO技术,学习和掌握Java NIO技术对于高性能.高并发网络的应用是非常关键的@mikechen NIO简介 NIO 中的 N 可以理解为 Non-blocking,不单纯是 N ...

  9. java-servlet-转发AND路径

    转发: a) 什么是转发?一个web组件将未完成的任务交给另一个web组件继续做.通常是一个servlet将数据获取之后转交给jsp进行展现.注:web组件值得是servlet或者jsp b) 如何转 ...

  10. 完全彻底的卸载MySQL5.7.35

    最开始接触计算机的时候关于MySQL卸载的这个问题,导致我重装了一次系统.就在今天我又遇到了同样的问题. Setp①: 想要安装新的数据库软件必须要先彻底且干净的删除掉以前的数据库. 第一步要做的是停 ...