SwiftUI知识点(一)

news2024/12/26 2:15:16

前言:

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 SwiftData

struct 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 SwiftUI

struct 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没有滚动属性,需要滚动的话,外面要包一个ScrollView
            LazyVGrid(
                columns: columns,
                //居中
                alignment: .center,
                //上下间距,即行间距,默认是6
                spacing: 1,
                //.sectionHeaders:头,划过去不消失,还在前面显示
                pinnedViews: [.sectionHeaders],
                
                content: {
                    ForEach(0..<70) { index in
                        Rectangle()
                            .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 in
                    RoundedRectangle(cornerRadius: 25)
                        .fill(.white)
                        .frame(height: 150)
                        .shadow(radius: 10)
                        .padding()
                }
            }
        }
        .background(.red)
    }
}

Button

在这里插入图片描述

state

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

太6了

extractSubView

import SwiftUI

struct 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: Int
    let title: String
    let myColor: Color
    
    var body: some View {
        VStack{
            Text("\(count)")
            Text(title)
        }
        .padding()//增加间距
        .background(myColor)
        .cornerRadius(10)//加圆角
    }
}

在这里插入图片描述

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

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

相关文章

概要设计说明书实际项目示例(原件直接套用Word)

1引言 1.1编写目的 1.2项目背景 1.3参考资料 2系统总体设计 2.1整体架构 2.2整体功能架构 2.3整体技术架构 2.4运行环境设计 2.5设计目标 3系统功能模块设计 3.1个人办公 3.2系统管理 4性能设计 4.1响应时间 4.2并发用户数 5接口设计 5.1接口设计原则 5.2接口实现方式 6运行设计…

【香橙派 AIpro 开发板】AI 应用部署测评:视频目标检测+Linux镜像+vscode远程连接+全细节试用

香橙派 AIpro 开发板 AI 应用部署测评 写在最前面一、开发板概述官方资料试用印象适用场景 二、详细开发前准备步骤1. 环境准备2. 环境搭建3. vscode安装ssh插件4. 香橙派 AIpro 添加连接配置5. 连接香橙派 AIpro6. SSH配置 二、详细开发步骤1. 登录 juypter lab2. 样例运行3. …

网络原理——http/https ---http(1)

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 今天你敲代码了吗 网络原理 HTTP/HTTPS HTTP,全称为"超文本传输协议" HTTP 诞⽣与1991年. ⽬前已经发展为最主流使⽤的⼀种应⽤层协议. 实际上,HTTP最新已经发展到 3.0 但是当前行业中主要使用的HT…

Java桥接模式

桥接模式 最重要的是 将 抽象 与 实现 解耦 , 通过组合 在 抽象 与 实现 之间搭建桥梁 ; 【设计模式】桥接模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )-CSDN博客 桥接模式&#xff08;Bridge Pattern&#xff09;-&#xff08;最通俗易懂的案例&#xff09;_桥接模式 例子-…

【Linux】(三)—— 文件管理和软件安装

文件管理 Linux的文件管理是系统管理中的核心部分&#xff0c;它涉及到如何组织、访问、修改和保护文件及目录结构。 目录 文件管理基本概念常用命令查看和切换目录创建文件和目录删除文件和目录文件拷贝移动和重命名文件文件查看cat文件查看more查找文件查找文本 数据流和管道…

保姆级讲解 Mybatis的配置与管理

Mybatis简介 MyBatis历史 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google Code。随着开发团队转投Google Code旗下&#xff0c;iBatis3.x正式更名为MyBatis。代码于2013年11月迁移到GithubiBatis一词来源于“intern…

大厂真实面试题(一)

滴滴大数据sql 取出累计值与1000差值最小的记录 1.题目 已知有表t_cost_detail包含id和money两列,id为自增,请累加计算money值,并求出累加值与1000差值最小的记录。 2.分析 本题主要是想找到累加值域1000差距最小的记录,也就是我们要对上述按照id进行排序并且累加,并…

华为如何造车?

引言 近年来&#xff0c;华为在智能汽车领域的布局备受关注&#xff0c;虽然华为创始人任正非曾多次表示华为不造车&#xff0c;但事实证明&#xff0c;华为在汽车产业链的深度参与已让人产生了“华为造车”的错觉。本文将探讨华为在汽车领域的发展历程&#xff0c;分析华为不…

F5G城市光网,助力“一网通城”筑基数字中国

《淮南子》中说&#xff0c;“临河而羡鱼&#xff0c;不如归家织网”。 这句话在后世比喻为做任何事情都需要提前做好准备&#xff0c;有了合适的工具&#xff0c;牢固的基础&#xff0c;各种难题也会迎刃而解。 如今&#xff0c;数字中国发展建设如火如荼&#xff0c;各项任务…

AI绘画软件深度测评:精选四款高效自动生成工具

随着人工智能技术的飞速发展&#xff0c;AI绘画软件已经成为艺术创作和设计领域的新宠。它们不仅能够提供无限的创意灵感&#xff0c;还能大幅提升工作效率。在经过对几十种AI绘画软件的测试后&#xff0c;我们特别推荐以下四款高效自动生成工具——Midjourney、Stable Diffusi…

Android Studio 下载 | 安装 | 下载 SDK | 中文插件 | 卸载

文章目录 下载安装包安装下载 SDK中文插件卸载 下载安装包 下载 Android Studio 和应用工具 - Android 开发者 | Android Developers 点击下载 Android Studio。 在协议最下方勾选同意&#xff08;第一次用最好还是看一眼&#xff09;&#xff0c;再点击 Dowload Android Stu…

人工智能时代,Martech未来的3种场景

多年来&#xff0c;人们一直在预测Martech Landscape的崩溃。成千上万个不同的Martech应用程序将被筛选出少数几个赢家。在过去的12年里&#xff0c;这些预测一直被证明是错误的&#xff0c;年复一年。 但也许&#xff0c;只是也许&#xff0c;人工智能时代将成为拐点&#xf…

九.网络层协议——IP协议

TCP和IP之间的关系 引言 IP协议全称为“网际互连协议&#xff08;Internet Protocol&#xff09;”&#xff0c;是TCP/IP体系中的网络层协议. 我们在上篇文章中曾经提到过&#xff0c;TCP的全称是传输控制协议(Transmission Control Protocol")&#xff0c;它和我们的IP…

用户管理的小demo--修改、删除

目录 1、删除 同理 异常往下抛出 2、修改 2.1 在修改页面 实现数据回显 同理 往下抛异常 2.2 更新数据 3、结果&#xff1a; 1、删除 同理 异常往下抛出 2、修改 2.1 在修改页面 实现数据回显 同理 往下抛异常 2.2 更新数据 3、结果&#xff1a;

SEACells:元细胞分析

元细胞是从单细胞测序数据中衍生的细胞分组&#xff0c;代表高度精细的不同细胞状态。在这里&#xff0c;作者介绍了单细胞细胞状态聚集 (SEACells)&#xff0c;这是一种用于识别元细胞的算法&#xff0c;它克服了单细胞数据的稀疏性&#xff0c;同时保留了传统细胞聚类所掩盖的…

安防综合管理系统EasyCVR视频汇聚平台GA/T 1400协议中的关键消息交互示例

在当今的信息化时代&#xff0c;公共安全防范日益成为保障社会和谐稳定的关键。视频监控系统作为现代安全防范的重要手段&#xff0c;正不断在公安、交通、城市管理等领域发挥着越来越重要的作用。而GA/T 1400协议视图库&#xff0c;作为公安视频图像信息应用系统的标准&#x…

【前端面试3+1】18 vue2和vue3父传子通信的差别、props传递的数据在子组件是否可以修改、如何往window上添加自定义属性、【多数元素】

一、vue2和vue3父传子通信的差别 1、Vue2 父组件向子组件传递数据通常通过props属性来实现。父组件可以在子组件的标签中使用v-bind指令将数据传递给子组件的props属性。在子组件中&#xff0c;可以通过props属性来接收这些数据。这种方式是一种单向数据流的方式&#xff0c;父…

SpringBoot配置Mysql+达梦双数据源

背景&#xff1a; 因项目需求&#xff0c;需使用Mysql达梦双数据源 涉及技术栈&#xff1a; SpringBoot、Druid、Mybatis、Mysql、达梦 一、引入pom依赖&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://mave…

视频汇聚EasyCVR安防监控系统GA/T 1400协议视图库对接:技术实现与应用

随着信息技术的不断发展&#xff0c;各类协议标准在各个领域得到了广泛应用。GA/T1400协议作为公安视频监控系统中的一种重要标准&#xff0c;对于提升公安工作的信息化水平、加强社会治安防控具有重要意义。本文将重点探讨GA/T1400协议视图库对接的技术实现及应用价值。 一、…

语音深度鉴伪识别项目实战:基于深度学习的语音深度鉴伪识别算法模型(三)音频去噪算法大全+Python源码应用

前言 深度学习技术在当今技术市场上面尚有余力和开发空间的&#xff0c;主流落地领域主要有&#xff1a;视觉&#xff0c;听觉&#xff0c;AIGC这三大板块。 目前视觉板块的框架和主流技术在我上一篇基于Yolov7-LPRNet的动态车牌目标识别算法模型已有较为详细的解说。与AIGC相…