DYPopoverView 1.1.1

DYPopoverView 1.1.1

Dominik Butz 维护。



  • dominikbutz

DYPopoverView

Version License Platform

DYPopoverView 是一个为 iOS 和 iPadOS 13 或更高版本提供的简单的 SwiftUI 辅助弹出视图。

示例项目

此仓库仅包含 Swift 包,不含示例代码。请在此处下载示例项目 这里。您需要通过 Cocoapods 或 Swift 包管理器 (见下文 - 安装) 添加 DYPopoverView 包。

特性

  • 8 个位置,自动适应箭头位置

  • 设置为弹出或弹出视图

  • 自定义以下设置

    • 动画
    • 偏移
    • 不同箭头位置
    • 箭头长度
    • 圆角半径

    详情请查看示例。

安装

推荐使用 Swift 包管理器 (SPM) 或 Cocoapods 安装。

SPM:选择您的项目(不是目标),然后选择 Swift 包选项卡。点击 + 并输入 DYPopoverView - SPM 应该能在 GitHub 上找到该包。

Cocoapods

平台 :ios, '13.0'

目标 '[项目名称]' do pod 'DYPopoverView' end

请查看下方的版本历史记录以获取当前版本。

请确保在每个使用DYPopoverView的文件中导入DYPopoverView。

    import DYPopoverView

使用方法

查看以下示例。此仓库只包含Swift包,没有示例代码。请从这里下载示例项目 此处

DYPopoverView example

代码示例:内容视图(您的主体视图)

DYPopoverView需要通过添加包含视图ID的anchorView修饰符来附加到另一个视图。或者,可以使用anchorFrame初始化它,确保将anchorFrame修饰符附加到锚视图而不是锚视图ID。锚视图可以在视图层级中比应用popoverView-修饰符的视图低几个级别。以下示例详细说明了。

import DYPopoverView

struct PopoverPlayground: View {
    
    @State private var showSecondPopover = false
    @State private var showFirstPopover  = false
    @State private var showNavPopover = false
    
    @State private var navBarPopoverOriginFrame: CGRect = .zero
    @State private var secondPopoverFrame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width * 0.75, height:150 )

    @State private  var popoverPosition: ViewPosition = .top
    
    var body: some View {
        GeometryReader {  proxy in
            NavigationView {
                
                    VStack(alignment: .center) {
               
                    Spacer()
                  
                    Button(action: {

                        self.showFirstPopover.toggle()
                           
                       }) {
                           TranslucentTextButtonView(title: "Popout", foregroundColor: .red, backgroundColor: .red, frameWidth: 100)
                    }.anchorView(viewId: "firstPopover").padding()
                           
                        Button(action: {
                           // self.viewId = "1"
                            self.showSecondPopover.toggle()
                          }) {
                            TranslucentTextButtonView(title: "Popover", foregroundColor: .accentColor, backgroundColor: .accentColor, frameWidth: 100).anchorView(viewId: "secondPopover")
                        }

                        Spacer()
                    
                        Picker("", selection: self.$popoverPosition) {
                            ForEach(0 ..< ViewPosition.allCases.count) {
                                Text(ViewPosition.allCases[$0].rawValue).tag(ViewPosition.allCases[$0])
                            }
                        }
                         
                    }
                    .frame(width: proxy.size.width).background(Color(.systemBackground))

                    .navigationBarItems(trailing: self.navBarButton )
                    .navigationTitle(Text("Test"))
              }
            .popoverView(content: { Text("Content")}, background: { Color(.secondarySystemBackground).onTapGesture {
                self.showNavPopover = false
            } }, isPresented: self.$showNavPopover, frame: .constant(CGRect(x:0, y:0, width: 200, height: 200)), anchorFrame: self.navBarPopoverOriginFrame, popoverType: .popout, position: .bottomLeft, viewId: "")
            .popoverView(content: {Text("Some content")}, background: {BlurView(style: .systemChromeMaterial)}, isPresented: self.$showFirstPopover, frame: .constant(CGRect(x: 0, y: 0, width: 150, height: 150)),  anchorFrame: nil, popoverType: .popout, position: self.popoverPosition, viewId: "firstPopover", settings: DYPopoverViewSettings(shadowRadius: 20))
            .popoverView(content: {ContentExample(frame: self.$secondPopoverFrame, show:self.$showSecondPopover)}, background: {Color(.secondarySystemBackground)}, isPresented: self.$showSecondPopover, frame: self.$secondPopoverFrame, anchorFrame: nil, popoverType: .popover, position: self.popoverPosition, viewId: "secondPopover", settings: DYPopoverViewSettings(cornerRadius: (30, 30, 30, 30)))
            
        }
    }
    
    var navBarButton: some View {
        Button(action: {
            self.showNavPopover.toggle()
        }, label: {
            Text("Pop")
        })
        .anchorFrame(rect: self.$navBarPopoverOriginFrame)
    }
}
   

变更日志

版本1.1.1

进行了细微的更改。

版本 1.1

添加了初始化弹出视图的另一种方式 - 使用anchorFrame而不是视图ID。如果锚视图是导航栏项目,使用视图ID初始化时,弹出视图可能不会始终正确出现。

版本 1.0.1

对导航项的锚视图进行轻微改进。

版本 1.0

初始化器更改 - 添加背景。从设置中删除 backgroundColor。

版本 0.2

初始化器更改 - 内容视图需要放入闭包中,而不是转换为 AnyView。

版本 0.1

首次公开发布。

作者

[email protected]

许可证

DYPopoverView 在 MIT 许可下可用。有关更多信息,请参阅 LICENSE 文件。