SwiftUI中Popover的使用(弹出方式,箭头位置,如何退出)

news2025/1/14 18:10:16

iOS中,popover是出现在现有内容顶部的UI元素,通常用于在上下文中向用户呈现新视图。与其他占用整个屏幕的视图控制器不同,popover出现在一个较小的、集中的区域,从而使用户能够在必要时与popover外的应用程序的其他部分进行交互。这是一种有效的方式来显示额外的信息或选项,而不会扰乱用户在应用程序中的当前流程。

基本使用

想要弹出一个popover还是比较简单的,我们只需要在对应的视图上添加.popover修饰符,并传入参数即可。

func popover<Content>(
    isPresented: Binding<Bool>,
    attachmentAnchor: PopoverAttachmentAnchor = .rect(.bounds),
    arrowEdge: Edge = .top,
    @ViewBuilder content: @escaping () -> Content
) -> some View where Content : View

isPresented: 绑定到一个布尔值,该值决定是否显示修饰符内容闭包返回的内容视图。
attachmentAnchor:定义popover附着点的定位锚。默认值是bounds。
arrowEdge: 箭头方向,iOS上这个参数不起作用。
content:返回popover要显示的内容视图。

struct PopoverDemo: View {
  @State private var showPopover: Bool = false

  var body: some View {
    ZStack {
      Color.cyan
        .ignoresSafeArea()

      Button {
        showPopover.toggle()
      } label: {
        Text("Show popover")
          .foregroundColor(.white)
          .padding()
          .background(
            Color.red
              .clipShape(Capsule())
          )
      }
      .popover(isPresented: $showPopover, content: {
        Text("I am a popover")
      })

    }
  }
}

iPhone:
在这里插入图片描述
iPad:
在这里插入图片描述
上面代码中,iPhone弹出了一个类似sheet的视图,而iPad确实popover弹框。

我们也可以在popover修饰符的闭包中给内部的视图添加frame,如下:

.popover(isPresented: $showPopover, content: {
  Text("I am a popover")
    .frame(width: 300, height: 200)
})

但是得到的效果是iPhone还是类似sheet的视图,而iPad却改变了弹框的尺寸。
在这里插入图片描述

popover弹出方式

如果想改变iPhone上的弹出方式,可以使用下面的修饰符,括号内传入想要的类型。

.presentationCompactAdaptation()

主要是针对Compact size class采取的弹出策略。

func presentationCompactAdaptation(_ adaptation: PresentationAdaptation) -> some View

PresentationAdaptation的类型主要有:

  • automatic: 默认弹出方式。
  • none: 不针对size class使用任何弹出方式,自适应视图尺寸。
  • popover: 悬浮弹框方式,自适应视图尺寸。
  • sheet: 类似sheet的弹出方式,从下往上,基本上要占满整个屏幕了,iPhone上默认的方式。
  • fullScreenCover: 全屏方式弹出。

在这里插入图片描述

popover的大小由所使用的视图的大小决定,如果尺寸较小,可以通过添加padding修饰符或者frame修饰符更改大小。视图的位置取决于我们将popover视图修饰符附加到哪个视图上,比如上面示例就是加到了Button上,所以popoverButton周围弹出。

箭头位置

使用.popover()修饰符的时候还可以传递一个参数attachmentAnchor,意思就是我们的popover的箭头指向哪个位置。

public enum PopoverAttachmentAnchor {
    /// The anchor point for the popover relative to the source's frame.
    case rect(Anchor<CGRect>.Source)

    /// The anchor point for the popover expressed as a unit point  that
    /// describes possible alignments relative to a SwiftUI view.
    case point(UnitPoint)
}

在这里插入图片描述
以上这些位置都是基于Button的位置,如果将.popover()修饰符添加到上面代码中的ZStack上,那么除了center这种能在中间显示,其他的都要出屏幕了。

在iOS上,arrowEdge参数被忽略了,系统会选择合适的值。arrowEdge值仅在macOS上使用。

退出popover

退出也很简单,要显示的时候将绑定的Bool值设置为true,需要dismiss的时候再设置为false即可。

在这里插入图片描述
或者将绑定的值再绑定到下一个界面,通过下一个界面改变该值,然后dismiss界面。

struct PopoverDemo: View {
  @State private var showPopover: Bool = false

  var body: some View {
    ZStack {
      Color.cyan
        .ignoresSafeArea()

      Button {
        showPopover = true
      } label: {
        Text("Show popover")
          .foregroundColor(.white)
          .padding()
          .background(
            Color.red
              .clipShape(Capsule())
          )
      }
      .popover(isPresented: $showPopover, content: {
        ActionView(showPopover: $showPopover)
          .presentationCompactAdaptation(.fullScreenCover)
      })
    }
  }
}

struct ActionView: View {
  @Binding var showPopover: Bool
  var body: some View {
    List(0..<10, id: \.self) { index in
      Button("Action \(index)") {
        showPopover = false
      }
    }
  }
}

在这里插入图片描述

写在最后

总之,SwiftUI中的popover将额外的内容覆盖到现有的视图上,提供上下文信息或选项,而不会干扰用户当前的工作流程。这与sheet不同,sheet占据了屏幕的较大部分,通常用于需要用户输入的更复杂的任务。popoversheet都是SwiftUI中必不可少的工具,允许更动态、直观和用户友好的应用程序设计。了解何时以及如何有效地使用这些功能可以大大提高iOS应用程序的整体用户体验。

最后,希望能够帮助到有需要的朋友,如果您觉得有帮助,还望点个赞,添加个关注,笔者也会不断地努力,写出更多更好用的文章。

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

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

相关文章

C#的web项目ASP.NET

添加实体类和控制器类 using System; using System.Collections.Generic; using System.Linq; using System.Web;namespace WebApplication1.Models {public class Company{public string companyCode { get; set; }public string companyName { get; set; }public string com…

国产飞腾/龙芯/瑞芯微芯片在信创行业应用:金融行业、教育行业、党政机关

党政机构 方案背景&#xff1a; 在国家提出信息技术应用创新发展战略的大环境下&#xff0c;政务大厅需要基于国家科技自主技术深入推进“互联网政务服务”。加快建设全国一体化在线政务服务平台&#xff0c;进一步落实创新驱动发展战略&#xff0c;提升政务网络安全保障能力…

智慧园区整理技术方案(ppt,软件全套建设方案)

智慧园区管控平台整体技术方案 1.平台概述 2.公共安全 3.物业管理 4.综合管理 5.企业服务 平台规划&#xff0c;整理技术架构搭建&#xff0c;统一门户&#xff0c;lot物联平台&#xff0c;视频云管理平台&#xff0c;GIS服务平台&#xff0c;服务器架构&#xff0c;统一身份认…

Ps:调整画笔工具

调整画笔工具 Adjustment Brush Tool可以将选区、创建蒙版和应用调整的传统工作流程合并为一个步骤&#xff0c;简化了对图像进行非破坏性局部调整的操作。 快捷键&#xff1a;B 调整画笔工具是 Photoshop 2024 年 5 月版&#xff08;25.9 版&#xff09;新增的工具。 ◆ ◆ …

JavaSE:SE知识整体总结

1、引言 历时一个多月的学习&#xff0c;已经掌握了JavaSE的知识&#xff0c;这篇博客就来做一下SE知识的总结~ 2、数据类型和变量 Java中的数据类型分为基本数据类型和引用数据类型。 2.1 基本数据类型 基本数据类型共有四类八种&#xff1a; 四类&#xff1a;整形、浮点…

遗留和现代数据库中的向量搜索

遗留和现代数据库中的向量搜索 image1 向量数据库是一种将数据&#xff08;包括文本、图像、音频和视频&#xff09;存储为向量的数据库&#xff0c;向量是高维空间中对象或概念的数学表示。 注意&#xff1a;根据数据的复杂程度和细节&#xff0c;每个向量的维数可能差别很大&…

SpringBoot的第二大核心AOP系统梳理

目录 1 事务管理 1.1 事务 1.2 Transactional注解 1.2.1 rollbackFor 1.2.2 propagation 2 AOP 基础 2.1 AOP入门 2.2 AOP核心概念 3. AOP进阶 3.1 通知类型 3.2 通知顺序 3.3 切入点表达式 execution切入点表达式 annotion注解 3.4 连接点 1 事务管理 1.1 事务…

面试杂谈k8s

其实看我之前的博客&#xff0c;k8s刚有点苗头的时候我就研究过&#xff0c;然后工作的时候间接接触 也自己玩过 但是用的不多就忘记了&#xff0c;正苦于不知道写什么&#xff0c;水一篇 用来面试应该是够了 支持云应用开发、运行与运维一体化的云应用平台软件应运而生 k8s核…

前端树形结构组件的设计与实现:以企查查、天眼查股权结构为例

摘要 随着信息化时代的不断发展&#xff0c;数据可视化在各行各业的应用越来越广泛。特别是在商业信息查询领域&#xff0c;如企查查、天眼查等平台&#xff0c;通过直观的数据展示方式&#xff0c;帮助用户快速理解复杂的商业关系。本文将以一个前端tree树形结构模版组件为例…

CompassArena 司南大模型测评--代码编写

测试角度 要说测试模型&#xff0c;对咱们程序员来说&#xff0c;那自然是写代码的能力强不强比较重要了。那么下面我们以 leetcode 中的一道表面上是困难题的题目来考考各家大模型&#xff0c;看看哪个才应该是咱们日常写程序的帮手。 部分模型回答 问题部分如下截图&#…

Day-04python模块

一、模块 1-1 Python 自带模块 Json模块 处理json数据 {"key":"value"} json不是字典 本质是一个有引号的字符串数据 json注意点 {} 中的数据是字符串引号必须是双引号 使用json模块可以实现将json转为字典&#xff0c;使用字典的方法操作数据 。 或者将…

HCIP-Datacom-ARST自选题库__MAC【14道题】

一、单选题 1.缺省情况下&#xff0c;以下哪种安全MAC地址类型在设备重启后表项会丢失? 黑洞MAC地址 Sticky MAC地址 安全动态MAC地址 安全静态MAC地址 2.华为交换机MAC地址表中的动态sticky MAC地址的默认老化时间是多少秒? 300 不会老化 400 500 3.华为交换机MA…

apache大数据各组件部署搭建(超级详细)

apache大数据数仓各组件部署搭建 第一章 环境准备 1. 机器规划 准备3台服务器用于集群部署,系统建议CentOS7+,2核8G内存 172.19.195.228 hadoop101 172.19.195.229 hadoop102 172.19.195.230 hadoop103 [root@hadoop101 ~]# cat /etc/redhat-release CentOS Linux rele…

揭秘APP广告变现项目

在当今移动应用市场&#xff0c;广告变现已经成为开发者盈利策略的重要组成部分。 通过在应用程序中展示多种类型的广告&#xff0c;如插页式广告、横幅广告和激励视频广告&#xff0c;开发者能够获得经济效益。 实现这一目标的核心在于平衡收入与用户体验&#xff0c;避免过…

【差分隐私联邦学习从入门到发文】

差分隐私联邦学习从入门到发文 差分隐私联邦学习从入门到发文一、学习相关理论1. 差分隐私理论解读2. 联邦学习相关收敛性分析3. 差分隐私经典论文解读4. 联邦学习代码解读5. 深度学习相关代码网站 二、必读论文三、最新进展2023 差分隐私联邦学习从入门到发文 这是关于差分隐…

虚拟现实环境下的远程教育和智能评估系统(五)

查阅相关VR眼动注意力联合教育学相关论文 1.Exploring Eye Gaze Visualization Techniques for Identifying Distracted Students in Educational VR&#xff08;IEEE VR 2020&#xff09; 摘要&#xff1a;我们提出了一种架构&#xff0c;使VR教学代理能够响应眼动追踪监控…

校园交友|基于SprinBoot+vue的校园交友网站(源码+数据库+文档)

校园交友网站 目录 基于SprinBootvue的校园交友网站 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2后台功能模块 5.2.1管理员功能模块 5.2.2用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#x…

2024年四川省三支一扶报名照片上传成功啦

2024年四川省三支一扶报名照片上传成功&#xff0c;一定要下载照片审核工具哦&#xff0c;详情如下图所示

【设计模式】创建型-建造者模式

前言 在面向对象的软件开发中&#xff0c;构建复杂对象时经常会遇到许多挑战。一种常见的解决方案是使用设计模式&#xff0c;其中建造者模式是一个强大而灵活的选择。本文将深入探讨建造者模式的原理、结构、优点以及如何在实际项目中应用它。 一、复杂的对象 public class…

ARM虚拟机安装OMV

OMV(OpenMediaVault)是基于 Debian GNU/Linux 的网络连接存储&#xff08;network attached storage&#xff0c;NAS&#xff09;解决方案。它包含 SSH、(S) FTP、SMB/CIFS、DAAP 媒体服务器、rsync、 BitTorrent 等很多种服务。它可用于 x86-64 和 ARM 平台。 在x86-64平台上&…