A library to present popovers.
Custom content |
List (Light) |
List (Dark) |
List (Custom item) |
---|---|---|---|
List (Horizontal layout) | |||
- Custom content
- Arrow direction
- Hidden Arrow
- Custom border
- Custom shadow
- Custom transition animation
- Custom list item
- Dark mode (iOS13+)
- Global appearance
- Arrow direction priority
- List appends/removes item
- Compatible with screen rotation
- iOS 12+
- Swift 5
- Xcode 15+
CocoaPods (recommended)
pod 'FSPopoverView'
github "lifution/FSPopoverView"
The Swift Package Manager is a tool for automating the distribution of Swift code and is integrated into the swift
compiler.
Once you have your Swift package set up, adding FSPopoverView as a dependency is as easy as adding it to the dependencies
value of your Package.swift
or the Package list in Xcode.
dependencies: [
.package(url: "https://github.com/lifution/FSPopoverView.git")
]
Download or clone the repository, drag the folder Source
into your project, and tick Copy items if needed
and Create groups
.
- If you need to customize the content, use FSPopoverView, implements the dataSource and return the contents.
let popoverView = FSPopoverView()
popoverView.dataSource = self
popoverView.present(fromBarItem: barItem)
// data source
extension viewController: FSPopoverViewDataSource {
func backgroundView(for popoverView: FSPopoverView) -> UIView? {
let view = UIView()
view.backgroundColor = .yellow
return view
}
func contentView(for popoverView: FSPopoverView) -> UIView? {
return contentView
}
func contentSize(for popoverView: FSPopoverView) -> CGSize {
return .init(width: 100.0, height: 100.0)
}
func containerSafeAreaInsets(for popoverView: FSPopoverView) -> UIEdgeInsets {
return view.safeAreaInsets
}
func popoverViewShouldDismissOnTapOutside(_ popoverView: FSPopoverView) -> Bool {
return true
}
}
- If you need to display a list, use
FSPopoverListView
, which providesFSPopoverListTextItem
by default.FSPopoverListView
is data-driven. InheritsFSPopoverListItem
andFSPopoverListCell
if you need to customize the item.
let features: [Feature] = [.copy, .message, .db, .qr, .settings]
let items: [FSPopoverListItem] = features.map { feature in
let item = FSPopoverListTextItem()
item.image = feature.image
item.title = feature.title
item.isSeparatorHidden = false
item.selectedHandler = { item in
guard let item = item as? FSPopoverListTextItem else {
return
}
print(item.title ?? "")
}
item.updateLayout()
return item
}
items.last?.isSeparatorHidden = true
let listView = FSPopoverListView()
listView.items = items
listView.present(fromRect: sender.frame.insetBy(dx: 0.0, dy: -6.0), in: view)
- Use
FSPopoverView.fs_appearance()
to customize default values for popover view.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
do {
let appearance = FSPopoverView.fs_appearance()
appearance.showsArrow = false
appearance.showsDimBackground = true
...
}
return true
}
- For more information on how to use, see the example project under the repository.
FSPopoverView is available under the MIT license. See the LICENSE file for more info.