SwiftUI-基础入门

news2024/11/16 17:54:20

开发OS X 图形应用界面时有三种实现方式:XIB、Storyboard、SwiftUI。Storyboard基于XIB做了优化,但XIB基本被放弃了,而SwiftUI是苹果公司后来开发的一套编程语言,用来平替Objective-C。虽然现在Swift 6 还是有些不完善的地方,但可以看到此为未来的主流。

  • 本系列课主要讲下SwiftUI方面的知识,不会过多涉及Swift基础语言,Swift可以查看笔者的另一个专题。本节做为第一节内容,主要课下应用构建的基础知识。
  • 笔者的开发环境为: Xcode Version 16.1 (16B40)、Swift 5,需要注意不同版本的Xcode其界面会有稍许差异,不同版本的Swift语言的API也会有一定的差异。

创建工程

所有的示例笔者会统一使用MacOS APP做为工程类型(因为IOS模拟器太占资源了),无论是OS还是IOS这对学习SwiftUI没有任何影响。

创建工程

在这里插入图片描述
一路Next,最后工程结构如下:
在这里插入图片描述

  • Preview Content:用于存放预览内容,开发者可以利用这些预览内容来快速查看和验证他们的界面设计在不同设备和屏幕尺寸上的表现,从而提高开发效率和界面质量;
  • .entitlements:相当于原来的info.plist文件,用于配置工程的一些设置;
  • Assets.xcassets:资源文件,主要用于存放图标;
  • XxApp.swift:工程启动入口函数,相当于main();
  • ContentView.swift:SwiftUI 界面设计源码,在正式程序中可能会有多个这样的UI界面源码文件,工程默认创建的这个文件会被XxApp.swift调用。

工程源码

  • 启动文件
import SwiftUI

@main  // 注意此标的使用
struct _1_base1App: App { //实现App协议
    var body: some Scene { //图控制器或应用入口点
        WindowGroup {
            ContentView() //调用UI实现类
        }
    }
}
  • Swift UI 视图
import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack { //布局
            Image(systemName: "globe")
                .imageScale(.large)
                .foregroundStyle(.tint)
            Text("Hello, world!")
        }
        .padding()
    }
}

 //这行可有可无,主要是用于开发时实时预览用的
#Preview {
    ContentView()
}

工程运行

在运行前最基本的有几个设置需要确认一下:

  • targets:同一工程可设置多个运行目标,可在项目设置的General面板中设置;
  • swift版本:可在building settings面板中设置;
    在这里插入图片描述

新建界面

如果要创建新的UI,可选择File- New- File from template,选择SwiftUI
在这里插入图片描述
默认代码如下:

import SwiftUI

struct SwiftUIView: View {
    var body: some View {
        Text("Hello, World!")
    }
}

#Preview {
    SwiftUIView()
}

Doc文档

  • 中文文档: https://gitee.com/guangjie2021/SwiftUICn
  • 苹果官方:https://developer.apple.com/documentation

基础组件

这里只介绍几个,详细的可以参考上述文档中的内容。

Text 文字

基础代码如下,下面代码中有一些是.gray的写法,其是为了简便编程,把位于SwiftUICore中对象的一些名称在调用时省略了。

import SwiftUI

struct SwiftUIText: View {
    var body: some View {
        VStack{
            Text("这是一个swiftui实现的文本label,可以设置一些属性")
                .font(.custom("slideyouran-Regular", size: 23))
                .foregroundColor(.gray)
                .lineLimit(2)
                .multilineTextAlignment(.center)
                .padding()
            
            Text("以下是一些详情信息")
                .font(.system(size: 23))
        }
        .padding()
    }
    
}

#Preview {
    SwiftUIText()
}
  • 自定义字体,在上述代码中有一行.font(.custom("slideyouran-Regular", size: 23))代码,这种是一种自定义字体的写法:
  1. 拷贝.ttf字体文件到工程中;
  2. 配置工程info信息;
  3. 编码;

工程info配置方法如下图所示,其中item 0 后面的值为字体的名称,这个名称可能会和文件名不一样,需要在系统中安装一下再确定:
在这里插入图片描述

Image 图片

图片有三种实现方式:

加载资源库图标

就是Assets库中的图片,在这个视图中可以添加文件夹等信息,但在使用时不需要关注其路径问题,但也意味着名称要唯一。

Image("DemoImg")
    .resizable()
    .scaledToFit()
    .frame(width: 64)
    .cornerRadius(12)

加载系统图标

苹果官方开发一个名为SF Symbols图标库的软件,这个软件主要用于查找系统图标名称,同时还能自动生成一些代码,供开发时何用。
在这里插入图片描述
这些图标相当于文字图标,可以使用内置函数设置颜色,线条等样式。

Image(systemName: "square.and.arrow.up.circle")
    .font(.system(size: 52))
    .symbolEffect(.bounce)
    .padding(12)

加载网络图片

就是从互联网上下载图片,但除了打开client设置外,还需要注意URL只能是https开头的。

            // 这是一种闭包写法:
            // image in:这是闭包的开始,image 是闭包的参数,代表加载的图像
            AsyncImage(url: URL(string: imageUrl)) { image in
                        image  // 这个闭包在图像加载完成后被调用
                            .resizable()
                            .scaledToFit()
                            .frame(width: 280)
                            .cornerRadius(16)
                    } placeholder: {
//                        Text("图片加载中")
//                            .font(.system(size: 24))
//                            .foregroundColor(.gray)
//                            .padding()
//                            .frame(width: 280,height: 160)
//                            .cornerRadius(16)
                        ProgressView()
                    }

在这里插入图片描述

自定义组件

SwiftUI的自定义组件比较简单,可以先了解下如何实现,后面章节再详细讲解。

自定义组件

比如如下代码,定义了一个自定义的TextDemo组件。同时也应该注意到,这里可以封装成比较复杂的套件。

import SwiftUI

// MARK: - 文字组件
struct TextDemo: View { 
   //组件参数
    var text: String
    var textSize: CGFloat
    var textColor: Color

   //组件样式
    var body: some View {
        Text(text)
            .font(.system(size: textSize))
            .foregroundColor(textColor)
    }
}

自定义组件调用

自定义组件调用

import SwiftUI

struct SloganTextView: View {
    var body: some View {
        VStack(spacing: 10) {
            TextDemo(text: "你好,世界。", textSize: 23, textColor: .black)
            TextDemo(text: "愿日子如熹光,愿你能幸福~", textSize: 17, textColor: .gray)
        }
    }
}

预览效果如下:
在这里插入图片描述

布局组件

SwiftUI中内置了三种纯布局组件:VStack、HStack、ZStack,基本代码写法如下,可做为一个容器使用。

struct ContentView: View {
    var body: some View {
        VStack {
            Image(systemName: "globe")
                .imageScale(.large)
                .foregroundStyle(.tint)
            Text("我是启动页")
        }
        .padding()
    }
}

主界面设计

实现一个底图+图标这样的简单设计。
在这里插入图片描述

import SwiftUI

struct StartUpUI: View {
    var body: some View {
            ZStack(alignment: .bottom) {
                // 背景图片
                Image("starup")
                    .resizable()
                    //.aspectRatio(contentMode: .fill)
                    .edgesIgnoringSafeArea(.all)
                VStack {
                    Spacer() // 占位空间
                    
                    // 应用图标和应用名称
                    HStack(alignment: .center, spacing: 20) {
                        // 应用图标
                        Image("DemoImg")
                            .resizable()
                            .aspectRatio(contentMode: .fit)
                            .frame(width: 60)
                            .cornerRadius(16)

                        // 应用名称
                        Text("世纪佳人")
                            .font(.system(size: 32))
                            .foregroundColor(.white)
                            .bold()
                    }
                }
            }
        }
}

#Preview {
    StartUpUI()
}

常用方法

组件设置

以下是一种设计,很多的操作都需要以resizable()为前提。

  • resizable():设置组件是否可以改变尺寸;
  • aspectRatio():在resizable()打开的,指定调整尺寸时的横纵比和固定比;
  • edgesIgnoringSafeArea():屏幕安全区设置;
  • frame(width: 60):设置组件大小;
  • cornerRadius(32):设置圆角

位置设置

  • Spacer():占位符,它会把他后面的元素计算完大小后,然后占据其它空间
`VStack {
    Text("这是顶部的文本")
    Spacer() // 占据剩余空间,将下面的文本推到底部
    Text("这是底部的文本")
}`
  • .frame():设置VStack的框架大小,下面这种infinity是一种自适应参数方式,非固定大小,建议用这种方式设置。
VStack {
    ......
}
.frame(maxWidth: .infinity, maxHeight: .infinity) // 设置VStack的框架大小
  • padding() 修饰符可以接受不同的参数来指定内边距的大小,默认为5px
Text("Hello, SwiftUI!")
    .padding(10.0) // 在文本视图周围添加10点的内边距

Text("Hello, SwiftUI!")
    .padding(.init(top: 10, leading: 20, bottom: 15, trailing: 25)) // 设置上、左(leading)、下、右(trailing)内边距

Text("Hello, SwiftUI!")
    .padding(.medium) // 使用中等大小的内边距

按钮与交互

SwiftUI的按钮实现有点特殊,它由两部分组成:事件+样式。其事件只有点击,但样式可以根据面要自定义,格式如下:

Button(action: {
    print("Tap") //事件
}) {
   Text("I'm a Button") //样式
}

按钮点击

在这里插入图片描述

struct TextButton: View {
    var body: some View {
        Button(action: { //事件
            print("aaa")
        }) {
            Text("立即使用")  //样式
                .font(.system(size: 17))
                .foregroundColor(.white)
                .padding()
                .frame(width: 180)
                .background(
                    LinearGradient(gradient: Gradient(colors: [Color.blue, Color.green]), startPoint: .leading, endPoint: .trailing))
                .cornerRadius(16)
        }
    }
}

上述的样式部分也可以换成图标,如下面代码

struct ImageBtnView: View {
    var body: some View {
        Button(action: {
            // 点击后的操作
        }) {
            Image("WoodenFish")
                .resizable()
                .scaledToFit()
                .frame(width: 160)
        }
    }
}

onTapGesture()手势

在这里插入图片描述
下面代码中用到了@State,其为状态缓存,用于MVVM交互使用的。

struct SwiftUIButton: View {
    @State var finNumber: Int = 1

    var body: some View {
        // 布局容器
        VStack(spacing: 32) {
            // 文字内容
            Text("功德+" + String(finNumber))
                .font(.system(size: 20))
                .foregroundColor(.black)

            // 图片按钮
            Image("WoodenFish")
                .resizable()
                .scaledToFit()
                .frame(width: 160)
                // 点击操作
                .onTapGesture {
                    finNumber += 1
                }
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2241653.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

androidstudio入门到放弃配置

b站视频讲解传送门 android_studio安装包:https://developer.android.google.cn/studio?hlzh-cn 下载安装 开始创建hello-world 1.删除缓存 文件 下载gradle文件压缩:gradle-8.9用自己创建项目时自动生成的版本即可,不用和我一样 https://…

如何在pycharm中 判断是否成功安装pytorch环境

1、在电脑开始端,找到 2、打开后 在base环境下 输入conda env list 目前我的环境中没有pytorch 学习视频:【Anaconda、Pytorch、Pycharm到底是什么关系?什么是环境?什么是包?】https://www.bilibili.com/video/BV1CN411s7Ue?vd_sourcefad0750b8c6…

昆明华厦眼科医院举办中外专家眼科技术研讨会

9月13日,“睿智迭代,增效赋能”Menicon Z Night中外专家研讨会在昆明华厦眼科医院成功举办。此次会议由目立康公司与昆明华厦眼科医院携手共筑,标志着双方合作迈向新的高度。 昆明华厦眼科医院总经理王若镜首先发表了热情洋溢的致辞&#xff…

HarmonyOS ArkUI(基于ArkTS) 开发布局 (上)

一 ArkUI(基于ArkTS)概述 基于ArkTS的声明式开发范式的方舟开发框架是一套开发极简、高性能、支持跨设备的UI开发框架,提供了构建应用UI所必需的能力 点击详情 特点 开发效率高,开发体验好 代码简洁:通过接近自然语义的方式描述UI&#x…

【STM32】项目实战——OV7725/OV2604摄像头颜色识别检测(开源)

本篇文章分享关于如何使用STM32单片机对彩色摄像头(OV7725/OV2604)采集的图像数据进行分析处理,最后实现颜色的识别和检测。 目录 一、什么是颜色识别 1、图像采集识别的一些基本概念 1. 像素(Pixel) 2. 分辨率&am…

SpringCloud-使用FFmpeg对视频压缩处理

在现代的视频处理系统中,压缩视频以减小存储空间、加快传输速度是一项非常重要的任务。FFmpeg作为一个强大的开源工具,广泛应用于音视频的处理,包括视频的压缩和格式转换等。本文将通过Java代码示例,向您展示如何使用FFmpeg进行视…

大数据学习14之Scala面向对象--至简原则

1.类和对象 1.1基本概念 面向对象(Object Oriented)是一种编程思想,面向对象主要是把事物给对象化,包括其属性和行为。面向对象编程更贴近实际生活的思想,总体来说面向对象的底层还是面向过程,面向过程抽象…

pipx安装提示找不到包

执行&#xff1a; pipx install --include-deps --force "ansible6.*"WARNING: Retrying (Retry(total4, connectNone, readNone, redirectNone, statusNone)) after connection broken by NewConnectionError(<pip._vendor.urllib3.connection.HTTPSConnection …

‘conda‘ 不是内部或外部命令,也不是可运行的程序或批处理文件,Miniconda

下载了conda&#xff0c;但是在cmd里执行conda --version会显示’conda’ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 原因是环境变量里没有添加conda&#xff0c;无法识别路径。 需要在系统环境变量里添加如下路径&#xff1a; 保存之后重新打开cmd&am…

【Qt】使用QString的toLocal8Bit()导致的问题

问题 使用Qt发送一个Http post请求的时候&#xff0c;服务一直返回错误和失败信息。同样的url以及post参数&#xff0c;复制黏贴到postman里就可以发送成功。就感觉很神奇。 原因 最后排查出原因是因为参数中含有汉字而导致的编码问题。 在拼接post参数时&#xff0c;使用了…

设计一致性的关键:掌握 Axure 母版使用技巧

设计一致性的关键&#xff1a;掌握 Axure 母版使用技巧 前言 在快节奏的产品开发周期中&#xff0c;设计师们一直在寻找能够提升工作效率和保持设计一致性的方法。 Axure RP&#xff0c;作为一款强大的原型设计工具&#xff0c;其母版功能为设计师们提供了一个强大的解决方案…

鸿蒙next ui安全区域适配(刘海屏、摄像头挖空等)

目录 相关api 团结引擎对于鸿蒙的适配已经做了安全区域的适配&#xff0c;也考虑到了刘海屏和摄像机挖孔的情况&#xff0c;在团结引擎内可以直接使用Screen.safeArea 相关api 团结引擎对于鸿蒙的适配已经做了安全区域的适配&#xff0c;也考虑到了刘海屏和摄像机挖孔的情况&am…

Android OpenGL ES详解——实例化

目录 一、实例化 1、背景 2、概念 实例化、实例数量 gl_InstanceID 应用举例 二、实例化数组 1、概念 2、应用举例 三、应用举例——小行星带 1、不使用实例化 2、使用实例化 四、总结 一、实例化 1、背景 假如你有一个有许多模型的场景&#xff0c;而这些模型的…

前端传数组 数据库存Json : [1,2,3]格式

一、前端正常传数组&#xff0c;但是value.toString() 即可 const empIds ref([1,2,3]) empIds.value empIds.value.toString() await updateApiRules(empIds.value) // 接口传参 二、后端用String类型接收后转换 String[] empIds updateDO.getEmpId().split("&#x…

《Java核心技术 卷I》用户图形界面鼠标事件

鼠标事件 如果只希望用户能够点击按钮或菜单&#xff0c;那么就不需要显式地处理鼠标事件&#xff0c;鼠标操作将由用户界面中的各种组件内部处理&#xff0c;不过&#xff0c;如果希望用户能使用鼠标画图&#xff0c;就需要捕获鼠标移动&#xff0c;点击和拖动事件。 本节&am…

贪心算法入门(三)

相关文章 贪心算法入门&#xff08;一&#xff09;-CSDN博客 贪心算法入门&#xff08;二&#xff09;-CSDN博客 1.什么是贪心算法&#xff1f; 贪心算法是一种解决问题的策略&#xff0c;它将复杂的问题分解为若干个步骤&#xff0c;并在每一步都选择当前最优的解决方案&am…

企业知识中台:构建智慧企业的核心

在当今数字化时代&#xff0c;企业知识中台已成为构建智慧企业的核心。它不仅是企业知识资产的集中地&#xff0c;也是推动企业创新和提高决策效率的关键。本文将分为四个部分&#xff0c;详细探讨知识中台的概念、重要性、构建步骤以及如何利用HelpLook工具搭建企业知识库。 …

基于Spring Boot的在线性格测试系统设计与实现(源码+定制+开发)智能性格测试与用户个性分析平台、在线心理测评系统的开发、性格测试与个性数据管理系统

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

机器学习 ---线性回归

目录 摘要&#xff1a; 一、简单线性回归与多元线性回归 1、简单线性回归 2、多元线性回归 3、残差 二、线性回归的正规方程解 1、线性回归训练流程 2、线性回归的正规方程解 &#xff08;1&#xff09;适用场景 &#xff08;2&#xff09;正规方程解的公式 三、衡量…

shell脚本(1)

声明&#xff1a;学习视频来自b站up主 泷羽sec&#xff0c;如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址&#xff1a;shell脚本&#xff08;1&#xff09;脚本创建执行与变量使用_哔哩哔哩_bilibili 本文主要讲解shell脚本的创建、执行和变量的使用。 一、脚本执行…