首页 > 其他分享 >SwiftUI中Popover的使用(弹出方式,箭头位置,如何退出)

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

时间:2024-05-31 23:32:07浏览次数:22  
标签:popover sheet showPopover 修饰符 视图 箭头 SwiftUI Popover View

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

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

标签:popover,sheet,showPopover,修饰符,视图,箭头,SwiftUI,Popover,View
From: https://blog.csdn.net/guoyongming925/article/details/139354369

相关文章

  • SwiftUI中SafeArea的管理与使用(ignoresSafeArea, safeAreaPadding, safeAreaInset)
    SafeArea是指不与视图控制器提供的导航栏、选项卡栏、工具栏或其他视图重叠的内容空间。在UIKit中,开发人员需要使用safeAreaInsets或safeAreaLayoutGuide来确保视图被放置在界面的可见部分。SwiftUI彻底简化了上述过程,除非开发者明确要求视图突破安全区域的限制,否则SwiftU......
  • 箭头函数
    //匿名函数letsum=function(a,b){returna+b;}//只有匿名函数才可以使用胖箭头简化//=>胖箭头sum=(a,b)=>{returna+b;};console.log(sum(1,2));//另外,如果参数大于一个,那么参数的圆括号不能省,直接干脆就别省最后的结......
  • R语言中绘制弧形箭头并添加文字
     001、测试01library(ggplot2)ggplot(data.frame(x=c(1,3),y=c(1,3)),aes(x=x,y=y))+geom_point()+geom_curve(aes(x=1.5,y=2.5,xend=2.6,yend=2.6),##绘制弧形箭头curvature=0.3,size=5,col="red",......
  • SwiftUI中AsyncImage的使用(一个高效的异步下载图片组件)
    iOS开发者经常会遇到需要在应用中显示网络图像的场景,无论是获取和显示用户头像,展示产品图像,等等。在原来的UIKit中,如果我们要用系统的API还是稍微有点麻烦,很多开发的朋友都选择了第三方的框架去处理网络图片的请求缓存等等。AsyncImage是SwiftUI中一个强大的功能,它简化了在......
  • Debug-012-el-popover 使用 doClose() 关闭窗口不生效的处理方案
     前言:    今天上午碰见一个非常奇怪的情况:一样的方法实现的功能,效果却不一样。两个页面都是使用的doClose()去关闭的el-popover,其中有一个就是不生效,找不同找了半天,始终不得其解。请看效果吧:el-popover-doClose()-ok视频1(el-popover-doClose()-关闭成功的)e......
  • css画箭头,三角形
    箭头.arrow{border:solidblack;border-width:01px1px0;display:inline-block;padding:4px;}//向上.up{transform:rotate(-135deg);-webkit-transform:rotate(-135deg);}//向下.down{transform:rotate(45deg);-webkit-transform:r......
  • c++箭头运算符在类与结构体之间可以做的功能简介
    #include<iostream>//箭头运算符在类与结构体之间可以做的功能以及重载运算符。#include<string>classentity{public: intx;public: voidprint()const{std::cout<<"hello!"<<std::endl;}};classscopedPtr{private: entity*m_Obj;public: sc......
  • SwiftUI中的组合动画(Simultaneous, Sequenced, Exclusive)
    了解了常见的几种手势后,接下来我们了解一下组合手势的操作,当一个视图存在多个手势的时候,为了避免手势冲突,SwiftUI提供了自定义手势的方法,比如同时进行,顺序进行等等。以下是一些常见的多种手势组合使用方式:simultaneously(with:):同时使用多个手势,使它们可以同时响应用户的......
  • SwiftUI中的手势(TapGesture、LongPressGesture、GestureState的使用)
    手势操作在App中可谓是用途非常广泛了,常规的手势修饰符有TapGesture点击手势、LongPressGesture长按手势、DragGesture拖拽手势,MagnificationGesture放缩手势和RoationGesture旋转手势。和常规的修饰符方法类似,只要将手势修饰符添加到视图中,系统就会自动识别用户的操作,并......
  • SwiftUI中的手势(DragGesture拖拽手势及Drag动画组件)
    上一篇文章我们了解了如何使用.gesture修饰符和@GestureState属性包装器,让我们看看另一种常见的手势:DragGesture拖拽手势。下面先看个效果图:这个效果中,我们实现了一个Text文本,并添加了拖拽手势,可以拖动到屏幕的任意位置,松手后停留在目标位置,而非回到原来的起点位置。UI......