swiftui基础组件Image加载图片,以及记载gif动图示例

想要在swiftui中展示图片,可以使用Image这个组件,这个组件可以加载本地图片和网络图片,也可以调整图片大小等设置。先大概看一下Image的方法有哪些可以用。

常用的Image属性

1.调整图像尺寸: 使用 resizable() 方法使图像可调整大小。您可以通过 frame() 方法设置具体的尺寸。

2.缩放图像: 使用 scaledToFit() 和 scaledToFill() 方法调整图像的缩放模式。scaledToFit() 会保持图像的原始纵横比并在给定的空间内最大化图像大小。scaledToFill() 会保持纵横比并填充给定的空间。

3.控制图像的缩放和裁剪方式:aspectRatio 有两种模式:.fit 和 .fill
.fit:保持图像的原始宽高比,确保整个图像在给定的空间内可见,即使这意味着在某些边缘留有空白。这是默认模式。
.fill:保持图像的原始宽高比,但确保填充整个给定空间,这可能会导致图像的某些部分被裁剪。

4.裁剪图像: 使用 clipped() 方法裁剪图像。这会删除在视图边界之外的所有图像部分。

5.设置图像透明度: 使用 opacity() 方法设置图像的透明度,0.0 为完全透明,1.0 为完全不透明。

6.设置图像的渲染模式: 使用 renderingMode() 方法设置图像的渲染模式。.template 模式将图像视为模板,从而可以使用 foregroundColor() 设置颜色。.original 模式将保留图像的原始颜色。

7.添加圆角: 使用 cornerRadius() 方法为图像添加圆角。

8.创建圆形图像: 使用 clipShape 为图像添加圆形裁剪。

9.添加叠加层: 使用 overlay() 方法在图像上添加叠加层。

10.添加边框: 使用 border() 方法为图像添加边框。

11.添加阴影: 使用 shadow() 方法为图像添加阴影。

12.添加背景: 使用 background() 方法为图像添加背景。

加载本地图片

将本地图片加载到项目资源中,在Assets.xcassets文件中,可以导入本地图片素材,Assets不仅可以导入图片,还可以设置颜色,这块我们以后会用到。点击Assets,在底部点击“+”按钮,选择Image Set(或者鼠标右键):

或者也可以直接点击 Import 导入图片资源: 

然后就可以在项目中使用 .文件名 导入图片了,如果图片名称是数字开头的,会自动加上一个下划线前缀,如果是英文开头,直接使用点就可以自动提示加载的图片资源:

加载之后的效果:

Image(.miniapp)

该代码初始化了一张图片,我们在模拟器上可以看到显示了图片,这是创建图片视图的基本语法。

我们看到图片会很大,只能看到一部分。这时候如果我们想要看到完整的图片,我们需要对图片进行缩放:

Image(.course).resizable()

实现效果:

我们可以看到模拟器中预留出了顶栏和底栏两块区域,这是因为由于有“安全区”的存在。安全区是排除顶部栏(即状态栏)和底部栏的视图区域,它定义了可以安全地放置UI组件的视图区域。有了安全区,可以预防在编程时有些UI控件不知道去哪里的风险。如果你想忽略安全区,把视图撑开整个屏幕,可以通过设置.edgesIgnoringSafeArea修饰符来忽略安全区域。

从模拟器中我们可以看到,示例图片已经有点变形,这是因为.resizable()只是简单的拉伸缩放,而没有保持原有的比例,如果我们想等比例缩放,那么我们需要使用.scaledToFit()修饰,这样就可以保持原有图像的宽高比。

//等比例缩放
Image("示例图片").resizable().scaledToFit()

另外,使用.aspectRatio(contentMode: .fill)也可以达到同样的效果,都试试吧。如果我们想调整图片的大小,方便我们和别的UI控件形成美感,那么我们也可以调整下图片的显示尺寸:

.frame(width: 250)

在App开发中,如果我们想要用一张图片作为头像,但我们的图片有可能不是圆形的。这时候,我们可以将多余的部分裁剪掉,留下中间的部分:.clipShape(Circle())

如果图片色调太深了,与App整体色调相冲突。我们可以尝试降低下图片的透明度,使它和App更和谐:.opacity(0.5)

有时候,图片只是作为背景存在,在图片上还会有文字或者图标的情况,示例:壁纸类软件。这时候,我们需要在图片视图上再增加添加一个视图,“覆盖”在上面,我们可以用.overlay()修饰符:

Image("示例图片").resizable().aspectRatio(contentMode: .fit).frame(width: 350).clipShape(Circle()).opacity(0.8).overlay(Text("编辑").fontWeight(.bold).font(.system(size: 24)).foregroundColor(Color.white))

或者直接设置Text的背景为图片:

        Text("Hacking With Swift").foregroundStyle(.red).fontWeight(.bold).font(.system(size: 48)).padding(50).background(Image(.miniapp).resizable())

效果图:

再引入一个知识点,Image除了可以展示本地导入的图片、网络图片,还可以显示系统图标。Apple官方提供了超过3000个新符号供开发者使用,开发者几乎无需自己收集常用图标。官方地址:

https://developer.apple.com/sf-symbols/

下载安装后,我们可以快速了解图标符号的名称,从而快速使用它。使用方式很简单,只需要在Image里添加systemName就可以了:

Image(systemName: "moon.fill").font(.system(size: 80))

 

加载网络图片

加载网络图片有多种方式,我们一个一个看,哪种方便我们就使用哪种

1.加载 AsyncImage 通过URL加载的图像文件

AsyncImage(url: URL(string: "https://hadoappusage.oss-cn-shanghai.aliyuncs.com/static/mini_image/miniapp.jpg"))

因为SwiftUI不知道下载的图像有多大,因此默认情况下AsyncImage在加载时具有灵活的宽度和高度。因此如果你不指定固定的宽度和高度,在图像加载之前会占用大量空间,然后在图像加载之后会调整到正确的大小:

AsyncImage(url: URL(string: "https://hadoappusage.oss-cn-shanghai.aliyuncs.com/static/mini_image/miniapp.jpg")) { image inimage.resizable()} placeholder: {Color.green}.frame(width: 300, height: 200).clipShape(RoundedRectangle(cornerRadius: 25))

 

2.AsyncImagePhase动态加载图片

显示image加载过程,会有菊花的中间视图过度

        AsyncImage(url: URL(string: "https://hadoappusage.oss-cn-shanghai.aliyuncs.com/static/mini_image/miniapp.jpg")) { phase inswitch phase {case .failure: Image(systemName: "photo").font(.largeTitle)case let .success(image): image.resizable()default: ProgressView()}}.frame(width: 200, height: 200).clipShape(Circle())

3.使用KFImage库

KFImage仓库地址:https://github.com/onevcat/Kingfisher

KFImage(URL(string: "https://hadoappusage.oss-cn-shanghai.aliyuncs.com/static/mini_image/10003.jpg")).resizable().frame(height: 200)

 

加载GIF动图

加载显示gif动图可以使用开源的gif库:https://github.com/igorcferreira/GIFImage

这个依赖库可以加载网络gif图,也可以加载本地gif图,使用起来还是相当给力的。但是需要注意:这个依赖库最低支持ios17.0版本以上的系统,所以根据自己项目来哦。安装依赖库:

1.加载网络gif图片

需要先引入 import GIFImage 组件库,创建URL变量

// 引入组件库
import GIFImage// 定义gif动图url
let url = URL(string: "https://hadoappusage.oss-cn-shanghai.aliyuncs.com/static/pad_image/beautiful.gif")!// 使用组件
GIFImage(source: .remoteURL(url))// 或者
GIFImage(url: "https://hadoappusage.oss-cn-shanghai.aliyuncs.com/static/pad_image/beautiful.gif")

使用示例:

2.加载本地Gif图

现将本地文件添加到xcode项目中,点击菜单栏的File > Add Files to 项目:

 

或者直接拖动文件到左侧的文件栏中:

添加到项目中之后,就可以使用Bundle引入到代码中了,比如引入的是txt文件,那么就:

// forResource是文件名,ofType是文件类型
let filePath = Bundle.main.path(forResource: "example", ofType: "txt")

如果是gif文件,就导入:

let filePath = Bundle.main.path(forResource: "beautiful", ofType: "gif")

引入之后,使用GIFImage显示动图:

let filePath = Bundle.main.path(forResource: "beautiful", ofType: "gif")// 显示
GIFImage(source: .local(filePath: filePath!))

显示效果:

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

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

相关文章

量子密钥分发系统基础器件(一):光纤干涉仪

干涉仪的基本原理是利用波的叠加来获得波的相位信息,从而获取实验中所关心的物理量。光纤干涉仪是由光学干涉仪发展而来的,利用光纤实现光的干涉,由于光纤取代透镜系统构成的光路具有柔软、形状可随意变化、传输距离远等特点,当前…

【Linux】23. 线程封装

如何理解C11中的多线程(了解) #include <iostream> #include <unistd.h> #include <thread>void thread_run() {while (true){std::cout << "我是新线程..." << std::endl;sleep(1);} } int main() {// 任何语言需要在Linux上实现多线…

解决IDEA菜单栏找不到VCS的问题,且使用IDEA推送新项目到托管仓库

问题描述&#xff1a; 在idea软件中使用git推送项目&#xff0c;idea页面顶部菜单栏无VCS 解决方案&#xff1a; 一&#xff1a;File->Settings->Version Control-> 点击 ->选择项目->VCS:->点击ok&#xff1a; 二&#xff1a;托管平台创建一个Git仓库来保…

Mysql 8.0 主从复制及读写分离搭建记录

前言 搭建参考&#xff1a;搭建Mysql主从复制 为什么要做主从复制&#xff1f; 做数据的热备&#xff0c;作为后备数据库&#xff0c;主数据库服务器故障后&#xff0c;可切换到从数据库继续工作&#xff0c;避免数据丢失。架构的扩展。业务量越来越大&#xff0c;I/O访问频…

6月来得及!考研数学120分复习规划:660/880/1000/1800怎么刷?

首先&#xff0c;120分是个什么概念&#xff1f; 如果目标120&#xff0c;历年真题就要135以上。这是因为&#xff1a; 1. 习题册里都是历年真题改编&#xff0c;很多题型见过了&#xff1b; 2. 考场发挥有不确定因素&#xff0c;所以需要安全边界。 总体规划 那么&#xff…

[java基础揉碎]文件IO流

目录 文件 什么是文件 文件流​编辑 常用的文件操作 创建文件方式一 创建文件方式二 创建文件方式三 tip:为什么new file 了还有执行createNewFile?new File的时候其实是在内存中创建了文件对象, 还没有在磁盘中, 当执行createNewFile的时候才是往磁盘中写入​编辑 …

WWW24因果论文(1/8) | 利用强化学习(智能体)进行因果问答

【摘要】因果问题询问不同事件或现象之间的因果关系。它们对于各种用例都很重要&#xff0c;包括虚拟助手和搜索引擎。然而&#xff0c;许多当前的因果问答方法无法为其答案提供解释或证据。因此&#xff0c;在本文中&#xff0c;我们旨在使用因果关系图来回答因果问题&#xf…

【Flutter】显式动画

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;Flutter学习 &#x1f320; 首发时间&#xff1a;2024年5月29日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f43e; 目…

微服务项目搭建之技术选型

1、什么是微服务 Java微服务是一种架构风格&#xff0c;通过将单个Spring Boot应用程序拆分为一组小型、独立的Spring Boot服务来构建分布式系统。每个微服务都运行在自己的进程中&#xff0c;并使用轻量级通信机制&#xff08;如HTTP或消息队列&#xff09;来进行相互之间的通…

【C++】从零开始构建红黑树 —— 节点设计,插入函数的处理 ,旋转的设计

送给大家一句话&#xff1a; 日子没劲&#xff0c;就过得特别慢&#xff0c;但凡有那么一点劲&#xff0c;就哗哗的跟瀑布似的拦不住。 – 巫哲 《撒野》 &#x1f30b;&#x1f30b;&#x1f30b;&#x1f30b;&#x1f30b;&#x1f30b;&#x1f30b;&#x1f30b; ⛰️⛰️…

在豆包这事上,字节看得很明白

大数据产业创新服务媒体 ——聚焦数据 改变商业 导语&#xff1a; 1.基于豆包的话炉/猫箱APP市场反响一般 2.价格战对于豆包来说是副产物 3.价格战对大模型市场是良性的 4.豆包接下来会推广至国际社会 因为宣称价格比行业便宜99.3%&#xff0c;豆包成功出圈了。根据火山引擎公…

笔试强训week6

day1 Q1 难度⭐⭐ 小红的口罩_牛客小白月赛41 (nowcoder.com) 题目&#xff1a; 疫情来了&#xff0c;小红网购了 n 个口罩。 众所周知&#xff0c;戴口罩是很不舒服的。小红每个口罩戴一天的初始不舒适度为 ai​。 小红有时候会将口罩重复使用&#xff08;注&#xff1a;…

【Linux】数据链路层协议+ICMP协议+NAT技术

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;Linux 目录 &#x1f449;&#x1f3fb;数据链路层&#x1f449;&#x1f3fb;以太网以太网帧格式网卡Mac地址对比ip地址 &#x1f449;&#x1f3fb;MTUMTU…

温度传感器安装热套管介绍

热套管&#xff08;Thermowell&#xff09;是一段末端封闭的金属管&#xff0c;主要通过焊接、螺纹或法兰连接的方式安装到过程容器或管线上&#xff0c;可保护温度传感器免受流致应力、高压和腐蚀性化学品等严苛工况的影响。此外&#xff0c;热套管使传感器可以轻松方便地拆下…

【管理咨询宝藏116】某大型国有集团公司战略落地保障方案

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏116】某大型国有集团公司战略落地保障方案 【格式】PDF版本 【关键词】战略落地、大型国企、战略报告 【核心观点】 - 资产规模以提高资产质量、…

项目十三:搜狗——python爬虫实战案例

根据文章项目十二&#xff1a;简单的python基础爬虫训练-CSDN博客的简单应用&#xff0c;这一次来升级我们的技术&#xff0c;那么继续往下看&#xff0c;希望对技术有好运。 还是老样子&#xff0c;按流程走&#xff0c;一条龙服务&#xff0c;嘿嘿。 第一步&#xff1a;导入…

华为诺亚等发布MagicDrive3D:自动驾驶街景中任意视图渲染的可控3D生成

文章链接&#xff1a;https://arxiv.org/pdf/2405.14475 项目链接&#xff1a;https://flymin.github.io/magicdrive3d 虽然可控生成模型在图像和视频方面取得了显著成功&#xff0c;但在自动驾驶等无限场景中&#xff0c;高质量的3D场景生成模型仍然发展不足&#xff0c;主…

Linux网络编程:应用层协议|HTTP

前言&#xff1a; 我们知道OSI模型上层分为应用层、会话层和表示层&#xff0c;我们接下来要讲的是主流的应用层协议HTTP&#xff0c;为什么需要这个协议呢&#xff0c;因为在应用层由于操作系统的不同、开发人员使用的语言类型不同&#xff0c;当我们在传输结构化数据时&…

【全开源】宇鹿家政系统(FastAdmin+ThinkPHP+原生微信小程序)

&#xff1a;助力家政行业数字化升级 一、引言&#xff1a;家政服务的新篇章 随着移动互联网的普及和人们生活水平的提高&#xff0c;家政服务的需求日益增长。为了满足这一市场需求&#xff0c;并推动家政行业的数字化升级&#xff0c;我们特别推出了家政小程序系统源码。这…

excel 点击单元格的内容 跳转到其他sheet设置

如图点击1处跳转到2 按照如下图步骤操作即可