SwiftUI知识点(一)

前言:

Swift知识点,大至看完了,公司项目是Swift语言写的,后续苹果新出的SwiftUI,也需要学习一下

不知觉间,SwiftUI是19年出的,现在24年,5年前的东西了

学习的几个原因:
  1. 项目工程里面有一部分SwiftUI的代码;
  2. 跟上脚步,学习新知识,给自己加分;
  3. Vision AR的开发语言是SwiftUI,以后想开发或者接触这些新东西,语言需要提前准备

这次学习,参考的是:B站SwiftUI Bootcamp (Beginner Level),一个歪果仁的课,讲的很不错~


struct ContentView: View {//xxx
}

定义一个ContentView,继承View?
不对,联想swift,struct没有继承,难道swiftUI的结构体可以继承???

点击进去,看到View的定义:

public protocol View {associatedtype Body : View@ViewBuilder @MainActor var body: Self.Body { get }
}

原来,View被定义为了protocol协议
struct可以遵守协议,因此,上述写法不是继承,而是遵守协议。


UI介绍

Text介绍

import SwiftUI
import SwiftDatastruct ContentView: View {@Environment(\.modelContext) private var modelContext@Query private var items: [Item]var body: some View {VStack {Image("dinner").resizable().aspectRatio(contentMode: .fit)Text("今天吃什么?").font(.largeTitle)//字体大小.fontWeight(.semibold)//字体样式.bold()//粗体.underline(true, color: Color.red)//下划线.italic()//斜线.strikethrough(true, color: Color.green)//穿过线.foregroundStyle(.purple)//颜色//原来那一套,size设置字体大小,weight设置是bold还是什么样式,design设置自己的字体Text("告诉我!").font(.system(size: 40, weight: .bold, design: .default))Text("NSOperation 需要配合 NSOperationQueue 来实现多线程。因为默认情况下,NSOperation 单独使用时系统同步执行操作,配合 NSOperationQueue 我们能更好的实现异步执行。").multilineTextAlignment(.trailing).kerning(1)//左右间距调大
//                .baselineOffset(20)//行间距调大:每一行,下面留20间距.baselineOffset(-20)//行间距调大:每一行,上面留20间距.frame(width: 200, height: 200, alignment: .center)//frame大小.background(.gray)//背景颜色}}
}#Preview {ContentView().modelContainer(for: Item.self, inMemory: true)
}

在这里插入图片描述

形状UI介绍

在这里插入图片描述

Color介绍

var body: some View {RoundedRectangle(cornerRadius: 25.0)//填充颜色//.fill(Color.red).fill(//Color(UIColor.blue)Color("CustomColor")//自定义颜色).frame(width: 250, height: 100)//阴影.shadow(color: .gray, radius: 20, x: 0, y: 1)}

渐变色

在这里插入图片描述

Frame

在这里插入图片描述

Background 和 OverLay

//
//  BackgroundAndOverlayView.swift
//  SwiftUI_Bootcamp_Learn_Code
//
//  Created by SYZ on 2024/5/30.
//import SwiftUIstruct BackgroundAndOverlayView: View {var body: some View {VStack{Text("Hello, World!-1").background(.red)Text("Hello, World!-2").background(LinearGradient(gradient: Gradient(colors: [Color.red, Color.blue]), startPoint: .leading, endPoint: .trailing))Text("Hello, World!-3").background(Circle().fill(Color.blue))Text("Hello, World!-4").frame(width: 120, height: 120).background(Circle().fill(Color.blue)).frame(width: 130, height: 130).background(){Circle().fill(Color.red)}.padding(EdgeInsets(top: 0, leading: 0, bottom: 50, trailing: 0))Text("Hello, World!-5").background(Circle().fill(Color.blue).frame(width: 120, height: 120, alignment: .bottom)).background(){Circle().fill(Color.red).frame(width: 130, height: 130, alignment: .bottom)}.padding(EdgeInsets(top: 0, leading: 0, bottom: 105, trailing: 0))Text("Hello, World!-6").background(Circle().fill(LinearGradient(gradient: Gradient(colors: [Color.red, Color.blue]), startPoint: .leading, endPoint: .trailing)).frame(width: 120, height: 120)).background(){Circle().fill(Color.red).frame(width: 130, height: 130)}.padding(EdgeInsets(top: 0, leading: 0, bottom: 60, trailing: 0))Circle().fill(.pink).frame(width: 100, height: 100).overlay(Text("1").font(.largeTitle).foregroundColor(.white))//可以看出,添加的背景色,在后面,而使用overlay的Text在前面.background(Circle().fill(.purple).frame(width: 120, height: 120)).padding(EdgeInsets(top: 0, leading: 0, bottom: 40, trailing: 0))Image(systemName: "heart.fill").font(.system(size: 40)).foregroundColor(.white).background(Circle().fill(LinearGradient(gradient: Gradient(colors: [Color.red, Color.blue]), startPoint: .leading, endPoint: .trailing)).frame(width: 100, height: 100).shadow(color: Color.gray, radius: 10, x: 0.0, y: 10).overlay(Circle().fill(.blue).frame(width: 35, height: 35).overlay(Text("5").font(.headline).foregroundStyle(.white).shadow(color: .gray, radius: 10, x: 5.0, y: 5.0)), alignment: .bottomTrailing))}}
}#Preview {BackgroundAndOverlayView()
}

在这里插入图片描述

Stack

VStack有两种创建方式:
VStack{}
VStack(alignment: .center, spacing: nil, content:{ })
第一种创建的时候,spacing是nil,有个8的大小,如果想不要间距,改为0即可

VStack:垂直方向
HStack:水平方向
ZStack:bottom-top方向

在这里插入图片描述

Padding And Spacer

Padding解决两两之间的间隔,或者本身自己预留 的间隔
Spacer主要解决平分等问题
在这里插入图片描述

ScrollView

在这里插入图片描述

Grid

struct LearnGridView: View {let columns: [GridItem] = [//.fixed:固定大小GridItem(.fixed(50), spacing: nil, alignment: nil),//代表一列GridItem(.fixed(150), spacing: nil, alignment: nil),//.flexible:灵活的//整分屏幕:如果只有一个,则整屏;如果有两个,则半屏;依次类推//spacing:左右间距,即列间距GridItem(.flexible(), spacing: nil, alignment: nil),GridItem(.flexible(), spacing: nil, alignment: nil),GridItem(.flexible(), spacing: nil, alignment: nil),//.adaptive:自适应,以最小值为准,尽量多放GridItem(.adaptive(minimum: 50, maximum: 120), spacing: nil, alignment: nil),GridItem(.adaptive(minimum: 150, maximum: 120), spacing: nil, alignment: nil),]var body: some View {ScrollView{//LazyVGrid没有滚动属性,需要滚动的话,外面要包一个ScrollViewLazyVGrid(columns: columns,//居中alignment: .center,//上下间距,即行间距,默认是6spacing: 1,//.sectionHeaders:头,划过去不消失,还在前面显示pinnedViews: [.sectionHeaders],content: {ForEach(0..<70) { index inRectangle().frame(height: 50).foregroundColor(.red)}}).background(.gray)}}
}

SafeArea

struct SafeView: View {var body: some View {Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/).background(.red).frame(width: .infinity, height: .infinity)Rectangle().frame(width: .infinity, height: .infinity).foregroundColor(.red)//忽略安全区,本来不到顶,现在忽略顶部的安全区,则直接到顶.ignoresSafeArea(.all, edges: .bottom)//忽略所有的安全区.ignoresSafeArea()ScrollView{VStack{Text("This is title").font(.largeTitle).frame(maxWidth: .infinity, alignment: .leading)ForEach(0..<10){ index inRoundedRectangle(cornerRadius: 25).fill(.white).frame(height: 150).shadow(radius: 10).padding()}}}.background(.red)}
}

Button

在这里插入图片描述

state

只需要在监听的var变量前,加上@state即可。告诉这个属性是可观察的,后面有地方改变,则所有用到的地方,都会被改变

太6了

extractSubView

import SwiftUIstruct LearnExtractSubView2: View {var body: some View {ZStack{Color.blue.ignoresSafeArea()contentLay}}var contentLay: some View {HStack{MyItem(count: 1, title: "apple", myColor: .red)MyItem(count: 19, title: "orange", myColor: .orange)MyItem(count: 33, title: "banana", myColor: .yellow)}}
}struct LearnExtractSubView2_Previews: PreviewProvider {static var previews: some View {LearnExtractSubView2()}
}struct MyItem: View {let count: Intlet title: Stringlet myColor: Colorvar body: some View {VStack{Text("\(count)")Text(title)}.padding()//增加间距.background(myColor).cornerRadius(10)//加圆角}
}

在这里插入图片描述

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

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

相关文章

Android Media Framework(一)OpenMAX 框架简介

学习开源代码最快的方式是先阅读它的文档&#xff0c;再查看它的头文件&#xff0c;最后研读代码实现并进行编译调试。Android早期引入OpenMAX IL作为使用音视频编解码器的标准接口&#xff0c;了解Android Media框架的底层运行原理要从OMX IL开始。在这一节&#xff0c;我们将…

本机安装深度学习库cuda11.8,cudnn8.6和tensorRT8.5

https://blog.csdn.net/qq_46107892/article/details/131453019 首先是安装cuda11.8 wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pinsudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600wg…

44-3 waf绕过 - WAF绕过方法

环境准备: 43-5 waf绕过 - 安全狗简介及安装-CSDN博客然后在安装pikachu靶场:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客一、首先验证云WAF是否存在于靶场(老师的靶场是部署在阿里云) 靶场地址:http://127.0.0.1/pikachu-master/v…

游戏找不到steam_api64.dll如何解决,全面解析原因及解决方法

在现代游戏中&#xff0c;Steam平台已经成为了玩家们下载、安装和玩游戏的主要渠道之一。然而&#xff0c;有些玩家可能会遇到一个问题&#xff0c;即游戏找不到steam_api64.dll文件。这个问题可能会导致游戏无法正常运行或启动。本文将详细介绍如何解决这个问题&#xff0c;帮…

23、linux系统文件和日志分析

linux文件系统与日志分析 文件时存储在硬盘上的&#xff0c;硬盘上的最小存储单位是扇区&#xff0c;每个扇区大大小是512字节。 inode&#xff1a;元信息&#xff08;文件的属性 权限&#xff0c;创建者&#xff0c;创建日期等&#xff09; block&#xff1a;块&#xff0c…

ZDH-数据管理模块

目录 主题 项目源码 预览地址 安装包下载地址 数据管理服务 数据资源管理 数据资源权限 数据资源血缘 总结 感谢支持 主题 本篇文章主要介绍ZDH-数据管理服务及应用场景 项目源码 zdh_web: GitHub - zhaoyachao/zdh_web: 大数据采集,抽取平台 预览地址 后台管理…

Mac安装pytorch(二)

书接上回&#xff0c;配置好了pytorch环境后&#xff0c;看看是否真的能用 终端输入一下代码&#xff1a; import torch xtorch.rand(3,4) print(x) 出现这些后表明安装完成&#xff0c;可使用 接下来在pycharm中使用 打开设置

JavaScript数组应用

检测数据类型 1.typeof()可以检测基本数据类型&#xff0c;但是在检测null时会返回object。另外它不能检测负责的数据类型&#xff0c;如正则表达式对象 2.constructor可以检测绝大部分数据的类型&#xff0c;但是不能检测null和underfined的数据类型 3.toString()方法&#x…

视频监控平台AS1000:通过网络SDK接入松下视频监控设备(Panasonic监控摄像机) 的源代码的函数和功能介绍及分享

目录 一、视频监控平台介绍 1、概述 2、视频接入能力介绍 3、功能介绍 二、PANASONIC网络摄像机 1、产品种类与定位 2、规格参数 3、功能特点 4、环境适应性 5、网络功能 6、其他特性 三、代码和解释 1、代码和注释 2、函数功能说明 &#xff08;1&#xff09;处…

网络网络层

data: 2024/5/25 14:02:20 周六 limou3434 叠甲&#xff1a;以下文章主要是依靠我的实际编码学习中总结出来的经验之谈&#xff0c;求逻辑自洽&#xff0c;不能百分百保证正确&#xff0c;有错误、未定义、不合适的内容请尽情指出&#xff01; 文章目录 1.协议结构2.封装分离3.…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷7(私有云)

#需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包及镜像&#xff09;或有问题的&#xff0c;可私聊博主&#xff01;&#xff01;&#xff01; #需要资源&#xff08;软件包…

24年护网工具,今年想参加护网的同学要会用

24年护网工具集 吉祥学安全知识星球&#x1f517;http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247483727&idx1&sndb05d8c1115a4539716eddd9fde4e5c9&chksmc0e47813f793f105017fb8551c9b996dc7782987e19efb166ab665f44ca6d900210e6c4c0281&scene21…

513.找树左下角的值

给定一个二叉树&#xff0c;在树的最后一行找到最左边的值。 示例 1: 示例 2: 思路&#xff1a; 深度最大的叶子结点一定是最后一行。 优先左边搜索&#xff0c;记录深度最大的叶子节点&#xff0c;此时就是树的最后一行最左边的值 代码&#xff1a; class Solution:def fi…

【C#】自定义List排序规则的两种方式

目录 1.系统排序原理 2.方式一&#xff1a;调用接口并重写 3.方式二&#xff1a;传排序规则函数做参数 1.系统排序原理 当我们对一个List<int>类型的数组如list1排序时&#xff0c;一个轻松的list1.sort();帮我们解决了问题 但是在实际应用过程中&#xff0c;往往我们…

【Python】Python异步编程

Python 异步编程 异步编程 异步编程是一种编程范式&#xff0c;通过非阻塞的方式执行任务&#xff0c;允许程序在等待某些操作&#xff08;如I/O操作、网络请求、数据库查询等&#xff09;完成时&#xff0c;继续执行其他任务。这与同步编程&#xff08;或阻塞编程&#xff09…

鸿蒙开发接口资源管理:【@ohos.intl (国际化-Intl)】

国际化-Intl 说明&#xff1a;开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 本模块首批接口从API version 6开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。Intl模块…

找出字符串中出现最多次数的字符以及出现的次数

str.charAt(i) 是JavaScript中获取字符串中特定位置字符的方法&#xff0c;表示获取当前的字符。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wi…

遥感影像信息提取

刘老师&#xff08;副教授&#xff09;&#xff0c;来自双一流重点高校&#xff0c;长期从事GIS/RS/3S技术及其生态环境领域中的应用等方面的研究和教学工作&#xff0c;并参与GIS的二次开发&#xff0c;发表多篇sci论文&#xff0c;具有资深的技术底蕴和专业背景。 专题一&am…

代码审计:Fortify SCA 代码审计神器.

什么是 Fortify SCA 代码审计工具 Fortify 是一个静态的、白盒的软件源代码安全测试工具。它通过内置的五大主要分析引擎&#xff1a;数据流、语义、结构、控制流、配置流等对应用软件的源代码进行静态的分析&#xff0c;通过与软件安全漏洞规则集进行匹配、查找&#xff0c;从…

WiFi蓝牙模块促进传统零售数字化转型:智能零售体验再升级

随着科技的不断发展&#xff0c;数字化转型已经成为了各行各业的必然趋势。在传统零售业中&#xff0c;WiFi蓝牙模块的应用正逐渐推动着行业的数字化转型&#xff0c;为消费者带来更加智能化、便捷化的零售体验。本文MesoonRF美迅物联网将从以下几个方面阐述WiFi蓝牙模块在传统…