DYPopoverView
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需要通过添加包含视图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
首次公开发布。
作者
许可证
DYPopoverView 在 MIT 许可下可用。有关更多信息,请参阅 LICENSE 文件。