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

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应用程序的整体用户体验。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

521源码-游戏源码-2024卡牌回合自走棋手游《梦间集》推出全新Linux手工服务端

首款稀有卡牌回合自走棋手游《梦间集》推出全新Linux手工服务端整理 更多网站源码&#xff0c;游戏源码&#xff0c;学习教程&#xff0c;请点击&#x1f449;-521源码-&#x1f448;获取最新资源 本游戏下载地址&#xff1a;2024卡牌回合自走棋手游《梦间集》推出全新Linux手…

算法(十三)回溯算法---N皇后问题

文章目录 算法概念经典例子 - N皇后问题什么是N皇后问题&#xff1f;实现思路 算法概念 回溯算法是类似枚举的深度优先搜索尝试过程&#xff0c;主要是再搜索尝试中寻找问题的解&#xff0c;当发生不满足求解条件时&#xff0c;就会”回溯“返回&#xff08;也就是递归返回&am…

switch语句

作用 让顺序执行的代码&#xff0c;产生分支。 基本语法 switch(变量) {//变量 常量 执行 case和 break之间的代码case 常量:满足条件执行的代码逻辑;break;case 常量:满足条件执行的代码逻辑;break;//case 可以有无数个default://如果上面case的条件都不满足 就会执行 def…

sqlite--SQL语句进阶

SQL语句进阶 函数和聚合 函数&#xff1a; SQL 语句支持利用函数来处理数据&#xff0c; 函数一般是在数据上执行的&#xff0c; 它给数据的转换和处理提供了方便常用的文本处理函数&#xff1a; 常用的文本处理函数&#xff1a; // 返回字符串的长度 length();//将字符串…

【阿里云】在云服务器ECS 安装MySQL、本地远程连接或宝塔连接(手动部署)

目录 一、安装MySQL 二、配置MySQL 三、远程访问MySQL数据库 四、Navicat本地连接远程MySQL 五、宝塔连接MySQL 如果你是使用宝塔安装的MySQL请绕过&#xff0c;以下是通过命令行模式&#xff08;手动部署&#xff09;进行安装、配置及运行。 安装&#xff1a;MySQL8.0 …

C#WPF数字大屏项目实战02--主窗体布局

1、主窗体起始属性 设置有关属性如下&#xff1a; WindowStyle"None"-》无边框 AllowsTransparency"True" -》允许透明 WindowStartupLocation"CenterScreen"-》启动时位于屏幕中间 FontFamily"Microsoft YaHei"-》字体微软雅黑 …

更新mirh connect 内置derby数据库密码

更新mirh connect 内置derby数据库密码 1、下载derby连接客户端 https://archive.apache.org/dist/db/derby/ 选择任意版本即可&#xff0c;比如 https://archive.apache.org/dist/db/derby/db-derby-10.14.2.0/db-derby-10.14.2.0-bin.zip 2、连接mirh文件数据库 1、把mi…

Linux主机安全可视化运维(免费方案)

本文介绍如何使用免费的主机安全软件,在自有机房或企业网络实现对Linux系统进行可视化“主机安全”管理。 一、适用对象 本文适用于个人或企业内的Linux服务器运维场景,实现免费、高效、可视化的主机安全管理。提前发现主机存在的安全风险,全方位实时监控主机运行时入侵事…

单片机原理及应用复习

单片机原理及应用 第二章 在AT89S52单片机中&#xff0c;如果采用6MHz晶振&#xff0c;一个机器周期为 2us 。 时钟周期Tocs1focs 机器周期 Tcy12focs 指令周期&#xff1a;一条指令所用的时间&#xff0c;单字和双字节指令一般为单机器周期和双机器周期。 AT89S5…

深色系的B端界面,特定场景非常适合。

深色系B端界面有以下几个好处&#xff1a; 提供更好的可读性&#xff1a;深色背景可以提供更高的对比度&#xff0c;使文字和图标更加清晰易读&#xff0c;尤其在低光环境下或者长时间使用的情况下&#xff0c;可以减少眼睛的疲劳。强调重要内容&#xff1a;深色背景可以使重要…

第 11 章 排序

第 11 章 排序 Abstract 排序犹如一把将混乱变为秩序的魔法钥匙&#xff0c;使我们能以更高效的方式理解与处理数据。 无论是简单的升序&#xff0c;还是复杂的分类排列&#xff0c;排序都向我们展示了数据的和谐美感。 本章内容 11.1 排序算法11.2 选择排序11.3 冒…

EitbaseEX香港业务开展,提升用户友好交易体验

在全球范围内备受瞩目的加密货币交易平台Coinbase&#xff0c;宣布正式入驻香港市场&#xff0c;并命名为EitbaseEX。这一战略性扩展举措&#xff0c;旨在为香港提供先进的加密货币交易技术和服务&#xff0c;同时将香港打造为其在亚太地区的重要枢纽。 作为国际金融中心&#…

基于云服务器使用DreamBooth训练主体

资源整理 参考教程&#xff1a;StableDiffusion/NAI DreamBooth自训练全教程 - 知乎 (zhihu.com) 云服务器平台&#xff1a;AutoDL算力云 | 弹性、好用、省钱。租GPU就上AutoDL 镜像链接&#xff1a;CrazyBoyM/dreambooth-for-diffusion/dreambooth-for-diffusion、 代码仓…

[Linux]vsftp配置大全---超完整版

[Linux]vsftp配置大全---超完整版 以下文章介绍Liunx 环境下vsftpd的三种实现方法 一、前言 Vsftp(Very Secure FTP)是一种在Unix/Linux中非常安全且快速稳定的FTP服务器&#xff0c;目前已经被许多大型站点所采用&#xff0c;如ftp.redhat.com,ftp.kde.org,ftp.gnome.org.等。…

Ubuntu20.04 Mysql基本操作知识

#Mysql基本知识 运行环境Ubuntu20.04 1.开启mysql服务 sytemctl start mysql不然&#xff0c;命令行进入myql交互行提交命令后&#xff0c;就会出现4200错误。 2.显示所有数据库 SHOW DATABASES;注意复数s&#xff0c;毕竟很多数据库 3.新建数据库test CREATE DATABASE …

推理和行动协同(Reason and Act,ReAct)和代码生成

文心一言 当我们将“推理和行动协同&#xff08;Reason and Act&#xff0c;ReAct&#xff09;”的概念应用于代码生成时&#xff0c;我们可以理解为一种指导原则或方法论&#xff0c;它强调了在代码生成过程中进行深思熟虑的决策&#xff08;Reason&#xff09;和有效执行&am…

Python | Leetcode Python题解之第123题买卖股票的最佳时机III

题目&#xff1a; 题解&#xff1a; class Solution:def maxProfit(self, prices: List[int]) -> int:n len(prices)buy1 buy2 -prices[0]sell1 sell2 0for i in range(1, n):buy1 max(buy1, -prices[i])sell1 max(sell1, buy1 prices[i])buy2 max(buy2, sell1 - …

C#WPF数字大屏项目实战01--开发环境与项目创建

1、学习目标 -界面布局 &#xff0c;- 模板调整&#xff0c;- 控件封装&#xff0c;- 图表&#xff0c;- 通信对接&#xff0c;- 动态更新 2、开发环境 开发工具&#xff1a;Visual Studio-2022-17.8.6-Community 运行时框架&#xff1a;.Net 6或Framework 4.5以上 UI框…

链表(2)反转链表

题目描述 反转一个单链表。&#xff08;题目来源&#xff09; 思路一 其实&#xff0c;反转一个单向链表&#xff0c;我们可以看成是将链表中的每个结点的指向反向&#xff08;即从后一个结点指向前一个结点&#xff09;。 我们在考虑情况的时候&#xff0c;还是可以先考虑一般…

【环境栏Composer】Composer常见问题(持续更新)

1、执行composer install提示当前目录中没有 composer.lock 文件时 No composer.lock file present. Updating dependencies to latest instead of installing from lock file. See https://getcomposer.org/install for more information. Composer 在执行 install 命令时会…