Swift开发——简单App设计

简介: SwiftUI教程概述:简化App设计,通过代码展示了如何创建一个计算两个数之和的界面。工程`MyCh0902`包含`ContentView.swift`,其中定义了`ContentView`和`MyView`结构体。`MyView`负责界面布局,使用`VStack`和`HStack`组织元素,如`TextField`和`Button`。点击`Button`调用`calc`方法处理输入并更新结果。界面设计可在Xcode的Inspector窗口中可视化配置。推荐将界面逻辑移到单独的`MyView.swift`文件中以清晰分离视图设计。

image.png


App的界面设计需要具有大量的图像并花费大量的时间,这样的应用不方便学习和交流,这里重点介绍SwiftUI界面元素的用法,通过简单App设计过程的讲解,展示图形用户界面应用程序的设计方法。



# 01、简单App设计



按照9.1节工程MyCh0901的创建方法,创建一个新的工程MyCh0902,此时工程管理器如图9-11所示。

image.png


■ 图9-11工程MyCh0902结构

在图9-11中,MyCh0902Tests和MyCh0902UITests下的文件是测试文件,PreviewContent下的文件为界面预览文件,这些文件不需要管理。Assets.xcassets为工程的资源管理文件,工程的图标、启动界面图像和各个界面元素的背景图像等均保存在其中。MyCh0902App.swift是程序启动入口文件;ContentView.swift文件是界面视图设计文件。

工程MyCh0902实现的界面功能如图9-12所示。

image.png


■ 图9-12工程MyCh0902实现的界面功能

在图9-12中,在Number One处输入一个数,在Number Two处输入另一个数,然后单击Compute按钮,将输入的两个数的和显示在Result处。

为了实现图9-12的功能,需要图9-11中的ContentView.swift文件,如程序段9-4所示。

程序段9-4文件ContentView.swift

image.png


image.png


在程序段9-4中,第3~10行为结构体ContentView,服从协议View,实现了View协议的计算属性body,body的类型为服从View协议的模糊类型。在body中有一个按列摆放界面元素的视图VStack,其中,第6行“MyView()”创建了一个MyView结构体实例。MyView结构体如第12~64行所示。

MyView结构体是自定义的结构体,其中完成了界面的设计和数据处理。

在MyView结构体内部,第14行“@State private var textOne:String=" "”定义私有属性textOne,“@State”表示该属性不需要使用mutating方法就可以读写。第15行“@State private var textTwo:String=" "”定义私有属性textTwo。第16行“@State private var textRes:String=" "”定义私有属性textRes。上述三个属性均为字符串类型,用作TextField和Text控件的显示文本。

第17~51行为计算属性body,其中放置了一个VStack视图(第19~50行),VStack视图是一个容器,将其中的控件按列排放,其摆放了三个HStack视图,HStack视图将其中的控件摆放在一行:①第一个HStack视图中放置了一个Text控件和一个TextField控件,如第22~26行所示。其中,Text控件显示蓝色的文本“Number One:”(第22~23行),TextField控件是文本编辑框,标签为Number One,显示的文本为textOne,文本颜色为绿色,控件带有边框(第24~25行)。②第二个HStack视图中放置了一个Text控件和一个TextField控件,如第27~32行所示。其中,Text控件显示蓝色的文本“Number Two:”(第28~29行),TextField控件是文本编辑框,标签为Number Two,显示的文本为textTwo,文本颜色为绿色,控件带有边框(第30~31行)。③第三个HStack视图中放置了两个Text控件、一个Spacer控件(用于分隔两个控件的空格控件)和一个命令按钮Button控件(第34~48行)。其中,第一个Text控件显示橙色的“Result:”文本,宽度为60,左对齐,如第34~36所示;第二个Text控件显示紫色的文本txtRes,宽度为140,高度为30,右对齐,边框为蓝色,如第37~40行所示;Button按钮显示红色的字号为20的文本Compute,带边框,背景色是透明度为0.1的橙色,宽度为150,控件右对齐,单击Button控件将调用calc方法,如第42~47行所示。

第50行“.frame(minWidth:0, maxWidth:.infinity, minHeight:0, maxHeight:.infinity, alignment:.topLeading)”设置VStack视图占据它所在的主视图(即第5行的VStack视图),且其中的控件摆放顺序为从顶至底。

第52~63行为calc方法,当单击Button控件时将调用该方法。第54行“let one=String(textOne.filter {![" ", "\t", "\n"].contains($0)})”去掉textOne字符串中的空格、Tab键和回车符,赋给one;第55行“let two=String(textTwo.filter {![" ", "\t", "\n"].contains($0)})”去除textTwo字符串中的空格、Tab键和回车符,赋给two。第56~62行为两层嵌套的if结构,使用了可选绑定技术,将one转换为Double型,赋给a(第56行);将two转换为Double型,赋给b(第58行);第60行“textRes=String(format:"%.2f", a+b)”将a与b的和转换为字符串赋给textRes,显示在第37行所示的Text控件中。

在进行SwiftUI程序设计时,有以下几点注意事项。

(1) 每个控件都有一些属性,设置这些属性使用类似于“.foregroundColor(Color.blue)”的方法,但在实际编程时,可以直接借助Inspector窗口可视化地设置,Inspector窗口位于Xcode开发界面的最右侧。例如,当单击程序段9-4的第22行时,Inspector窗口的显示内容如图9-13所示。当单击不同的界面元素时,Inspector窗口将显示该界面元素对应的属性(称为Modifiers),Inspector称为属性设置器。

image.png


■ 图9-13Text控件的Inspector窗口

由图9-13可知,Text控件相关的显示属性均列在Inspector窗口中了。例如,在图9-13中,在Font一栏中的Weight项(旁的下拉列表框)中选择Bold(图9-13中为Inherited,表示使用其父类的字体样式),则在第22行和第23行之间,自动添加“.fontWeight(.bold)”。每个控件的属性显示和代码中输入的属性有对应关系。在实际程序设计时,一般会先在程序代码中列出界面元素的名称和属性,然后再借助界面元素的Inspector窗口进行可视化配置。

(2) 通过工程MyCh0901和MyCh0902可知,工程中“工程名App.swift”样式的程序文件的内容不需要改动,但是文件名可以重新命名。例如,在工程MyCh0902中,MyCh0902App.swift文件的内容不需要改动,但是文件名可以重新命名为MyApp.swift。

(3) 通过工程MyCh0901和MyCh0902可知,工程中ContentView.swift文件是界面设计文件,一种更通用的做法是在工程中新建一个文件,命名为MyView.swift(文件名随意选取,与其中的结构体名没有关系)。针对工程MyCh0902,添加的MyView.swift工程管理器如图9-14所示。

image.png

■ 图9-14新工程MyCh0902的工程管理器


在图9-14中,添加了新的程序文件MyView.swift,将程序文件ContentView.swift中的结构体MyView移动到文件MyView.swift中,并在MyView.swift头部添加import SwiftUI。这样界面设计的全部工作都由MyView.swift完成。如果把ContentView.swift文件中的ContentView_Previews结构体也移动到文件MyView.swift中,则编辑MyView.swift程序时可以看到预览界面。这样处理后的ContentView.swift的代码如程序段9-4的第1~10行所示,后续工作无须改动这些代码; 或者,将这些代码修改为如下形式:

image.png


这样,在ContentView结构体的计算属性body中可以直接创建结构体MyView的实例,实现界面的显示。

(4) Swift语言是Apple推出的替换Object-C的程序设计语言,SwiftUI也是Apple主推的界面设计方法,它与经典的StoryBoard方法各有特色,Apple建议使用SwiftUI,SwiftUI的界面元素属性和方法处理更具人性化。但是,优秀的用户界面需要使用大量美观的图像,SwiftUI的大部分界面元素可以指定背景图像,有些甚至可以指定动画图像。

目录
相关文章
|
5天前
|
编解码 Java Android开发
FFmpeg开发笔记(三十一)使用RTMP Streamer开启APP直播推流
RTMP Streamer是一款开源的安卓直播推流框架,支持RTMP、RTSP和SRT协议,适用于各种直播场景。它支持H264、H265、AV1视频编码和AAC、G711、OPUS音频编码。本文档介绍了如何使用Java版的RTMP Streamer,建议使用小海豚版本的Android Studio (Dolphin)。加载项目时,可添加国内仓库加速依赖下载。RTMP Streamer包含五个模块:app、encoder、rtmp、rtplibrary和rtsp。完成加载后,可以在手机上安装并运行APP,提供多种直播方式。开发者可以从《FFmpeg开发实战:从零基础到短视频上线》获取更多信息。
31 7
FFmpeg开发笔记(三十一)使用RTMP Streamer开启APP直播推流
|
10天前
|
存储 Swift 索引
Swift开发——索引器扩展
扩展用于向已存在的类型(例如,类、结构体、枚举和协议等)中添加新的功能,扩展甚至可以向系统类型(包括无法查阅代码的类型)中添加新的功能,但是扩展不能覆盖原类型中已有的方法,扩展也不能向类中添加新的存储属性。
30 6
Swift开发——索引器扩展
|
10天前
|
存储 Swift
Swift开发——属性检查器
Swift中的属性检查器(willSet, didSet)允许在设置存储属性值前后执行代码。在类`Circle`中,属性`radius`使用属性观察器:willSet在赋值前检查值,若值为负则打印警告;didSet在赋值后比较新旧值,根据变化输出相应信息。在实例`c`中,`radius`从-5变为0时,输出“Input value is negative.”和“The circle gets smaller.”;从0变为10时,输出“Input value is normal.”和“The circle gets larger.”。
14 4
Swift开发——属性检查器
|
9天前
|
存储 Swift
Swift开发——弱占用
Swift的自动引用计数(ARC)管理类实例内存,通过强引用保持实例存活。当出现强引用循环时,可使用`weak`关键字创建弱引用,避免阻止实例释放。弱引用在不再被强引用时导致对象立即释放。示例中,添加`weak`至`author`和`book`变量防止引用循环,使得两者析构器均执行,释放内存。图2展示了弱引用结构,当解除所有强引用后,ARC自动释放实例,调用析构器。
16 1
Swift开发——弱占用
|
8天前
|
开发框架 移动开发 JavaScript
SpringCloud微服务实战——搭建企业级开发框架(四十七):【移动开发】整合uni-app搭建移动端快速开发框架-添加Axios并实现登录功能
在uni-app中,使用axios实现网络请求和登录功能涉及以下几个关键步骤: 1. **安装axios和axios-auth-refresh**: 在项目的`package.json`中添加axios和axios-auth-refresh依赖,可以通过HBuilderX的终端窗口运行`yarn add axios axios-auth-refresh`命令来安装。 2. **配置自定义常量**: 创建`project.config.js`文件,配置全局常量,如API基础URL、TenantId、APP_CLIENT_ID和APP_CLIENT_SECRET等。
|
11天前
|
安全 JavaScript 前端开发
kotlin开发安卓app,JetPack Compose框架,给webview新增一个按钮,点击刷新网页
在Kotlin中开发Android应用,使用Jetpack Compose框架时,可以通过添加一个按钮到TopAppBar来实现WebView页面的刷新功能。按钮位于右上角,点击后调用`webViewState?.reload()`来刷新网页内容。以下是代码摘要:
|
11天前
|
存储 程序员 Swift
Swift开发——存储属性与计算属性
Swift推荐使用结构体进行开发,结构体支持属性和方法,且作为值类型。结构体属性包括存储属性(如radius)和计算属性(如r),计算属性不存储值,类似方法。结构体用`struct`定义,命名遵循大驼峰规则。实例名遵循小驼峰规则。属性可在结构体中任意位置定义,静态属性用`static`。存储属性可为`lazy`实现懒加载。结构体实例通过`.`访问属性和方法,静态属性和方法用`结构体名.`访问。计算属性可读写,可通过`get`和`set`定义。程序段1展示了结构体Point和Circle的属性和方法,包括私有属性、只读计算属性、可读写计算属性及`mutating`方法。
10 0
Swift开发——存储属性与计算属性
|
9天前
|
移动开发 小程序 安全
基础入门-APP架构&小程序&H5+Vue语言&Web封装&原生开发&Flutter
基础入门-APP架构&小程序&H5+Vue语言&Web封装&原生开发&Flutter
|
iOS开发 Swift C++
Swift开发笔记1.《Swift开发指南》计算器实战项目的相关心得
        本人是个IOS开发新手,之前没有接触过Objective-C语言,直接从最新的Swift学起,进行IOS8的学习开发。
971 0
|
1月前
|
安全 编译器 Swift
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
IOS开发基础知识: 对比 Swift 和 Objective-C 的优缺点。
148 2