[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-6914":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":16,"compositeScore":19,"rankGlobal":10,"rankLanguage":10,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":21,"hasPages":21,"topics":23,"createdAt":10,"pushedAt":10,"updatedAt":32,"readmeContent":33,"aiSummary":34,"trendingCount":16,"starSnapshotCount":16,"syncStatus":18,"lastSyncTime":35,"discoverSource":36},6914,"PopupDialog","Orderella\u002FPopupDialog","Orderella","A simple, customizable popup dialog for iOS written in Swift. Replaces UIAlertController alert style.","http:\u002F\u002Fwww.mwfire.de",null,"Swift",4028,520,71,15,0,1,2,30.15,"Other",false,"master",[24,25,26,27,28,29,30,31],"alert","alertview","dialog","modal","overlay","popup","popup-dialog","swift","2026-06-12 02:01:31","\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FOrderella\u002FPopupDialog\u002Fblob\u002Fmaster\u002FAssets\u002FPopupDialogLogo.png?raw=true\" width=\"300\">\n\n\u003Cp>&nbsp;\u003C\u002Fp>\n\n![Swift Version](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FSwift-5-orange.svg)\n[![Version](https:\u002F\u002Fimg.shields.io\u002Fcocoapods\u002Fv\u002FPopupDialog.svg?style=flat)](http:\u002F\u002Fcocoapods.org\u002Fpods\u002FPopupDialog)\n[![License](https:\u002F\u002Fimg.shields.io\u002Fcocoapods\u002Fl\u002FPopupDialog.svg?style=flat)](http:\u002F\u002Fcocoapods.org\u002Fpods\u002FPopupDialog)\n[![Platform](https:\u002F\u002Fimg.shields.io\u002Fcocoapods\u002Fp\u002FPopupDialog.svg?style=flat)](http:\u002F\u002Fcocoapods.org\u002Fpods\u002FPopupDialog)\n[![Carthage compatible](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FCarthage-compatible-4BC51D.svg?style=flat)](https:\u002F\u002Fgithub.com\u002FCarthage\u002FCarthage)\n[![Build Status Master](https:\u002F\u002Ftravis-ci.org\u002FOrderella\u002FPopupDialog.svg?branch=master)](https:\u002F\u002Ftravis-ci.org\u002FOrderella\u002FPopupDialog)\n[![Build Status Development](https:\u002F\u002Ftravis-ci.org\u002FOrderella\u002FPopupDialog.svg?branch=development)](https:\u002F\u002Ftravis-ci.org\u002FOrderella\u002FPopupDialog)\n[![Reviewed by Hound](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FReviewed_by-Hound-8E64B0.svg)](https:\u002F\u002Fhoundci.com)\n\n\u003Cp>&nbsp;\u003C\u002Fp>\n\n# Introduction\n\nPopup Dialog is a simple, customizable popup dialog written in Swift.\n\n\u003Cimg align=\"left\" src=\"https:\u002F\u002Fgithub.com\u002FOrderella\u002FPopupDialog\u002Fblob\u002Fmaster\u002FAssets\u002FPopupDialog01.gif?raw=true\" width=\"300\">\n\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FOrderella\u002FPopupDialog\u002Fblob\u002Fmaster\u002FAssets\u002FPopupDialog02.gif?raw=true\" width=\"300\">\n\u003Cimg align=\"left\" src=\"https:\u002F\u002Fgithub.com\u002FOrderella\u002FPopupDialog\u002Fblob\u002Fmaster\u002FAssets\u002FPopupDialog03.gif?raw=true\" width=\"300\">\n\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FOrderella\u002FPopupDialog\u002Fblob\u002Fmaster\u002FAssets\u002FPopupDialogDark01.png?raw=true\" width=\"300\">\n\n## Features\n\n- [x] Easy to use API with hardly any boilerplate code\n- [x] Convenient default view with image, title, message\n- [x] Supports custom view controllers\n- [x] Slick transition animations\n- [x] Fully themeable via appearance, including fonts, colors, corner radius, shadow, overlay color and blur, etc.\n- [x] Can be dismissed via swipe and background tap\n- [x] Objective-C compatible\n- [x] Works on all screens and devices supporting iOS 10.0+\n\n\u003Cp>&nbsp;\u003C\u002Fp>\n\n# Installation\n\nThis version is Swift 5 compatible. For the Swift 4.2 version, please use [V1.0.0](https:\u002F\u002Fgithub.com\u002FOrderella\u002FPopupDialog\u002Freleases\u002Ftag\u002F1.0.0).\n\n## CocoaPods\n\nPopupDialog is available through [CocoaPods](http:\u002F\u002Fcocoapods.org). Simply add the following to your Podfile:\n\n```ruby\nuse_frameworks!\n\ntarget '\u003CYour Target Name>'\npod 'PopupDialog', '~> 1.1'\n```\n\n## Carthage\n\n[Carthage](https:\u002F\u002Fgithub.com\u002FCarthage\u002FCarthage) is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks. A minimum version of `0.17` is required.\n\nTo install, simply add the following lines to your Cartfile:\n\n```ruby\ngithub \"Orderella\u002FPopupDialog\" ~> 1.1\n```\n\n## Manually\n\nIf you prefer not to use either of the above mentioned dependency managers, you can integrate PopupDialog into your project manually by adding the files contained in the [Classes](https:\u002F\u002Fgithub.com\u002Ftrungp\u002FPopupDialog\u002Ftree\u002Fmaster\u002FPopupDialog\u002FClasses)\nfolder to your project. Moreover, you have to manually add the classes of [DynamicBlurView](https:\u002F\u002Fgithub.com\u002FKyoheiG3\u002FDynamicBlurView\u002Ftree\u002Fmaster\u002FDynamicBlurView) to your project.\n\n\n\u003Cp>&nbsp;\u003C\u002Fp>\n\n# Example\n\nYou can find this and more example projects in the repo. To run it, clone the repo, and run `pod install` from the Example directory first.\n\n```swift\nimport PopupDialog\n\n\u002F\u002F Prepare the popup assets\nlet title = \"THIS IS THE DIALOG TITLE\"\nlet message = \"This is the message section of the popup dialog default view\"\nlet image = UIImage(named: \"pexels-photo-103290\")\n\n\u002F\u002F Create the dialog\nlet popup = PopupDialog(title: title, message: message, image: image)\n\n\u002F\u002F Create buttons\nlet buttonOne = CancelButton(title: \"CANCEL\") {\n    print(\"You canceled the car dialog.\")\n}\n\n\u002F\u002F This button will not the dismiss the dialog\nlet buttonTwo = DefaultButton(title: \"ADMIRE CAR\", dismissOnTap: false) {\n    print(\"What a beauty!\")\n}\n\nlet buttonThree = DefaultButton(title: \"BUY CAR\", height: 60) {\n    print(\"Ah, maybe next time :)\")\n}\n\n\u002F\u002F Add buttons to dialog\n\u002F\u002F Alternatively, you can use popup.addButton(buttonOne)\n\u002F\u002F to add a single button\npopup.addButtons([buttonOne, buttonTwo, buttonThree])\n\n\u002F\u002F Present dialog\nself.present(popup, animated: true, completion: nil)\n```\n\n\u003Cp>&nbsp;\u003C\u002Fp>\n\n# Usage\n\nPopupDialog is a subclass of UIViewController and as such can be added to your view controller modally. You can initialize it either with the handy default view or a custom view controller.\n\n## Default Dialog\n\n```swift\npublic convenience init(\n    title: String?,\n    message: String?,\n    image: UIImage? = nil,\n    buttonAlignment: UILayoutConstraintAxis = .vertical,\n    transitionStyle: PopupDialogTransitionStyle = .bounceUp,\n    preferredWidth: CGFloat = 340,\n    tapGestureDismissal: Bool = true,\n    panGestureDismissal: Bool = true,\n    hideStatusBar: Bool = false,\n    completion: (() -> Void)? = nil) \n```\n\nThe default dialog initializer is a convenient way of creating a popup with image, title and message (see image one and three).\n\nBascially, all parameters are optional, although this makes no sense at all. You want to at least add a message and a single button, otherwise the dialog can't be dismissed, unless you do it manually.\n\nIf you provide an image it will be pinned to the top\u002Fleft\u002Fright of the dialog. The ratio of the image will be used to set the height of the image view, so no distortion will occur.\n\n## Custom View Controller\n\n```swift\npublic init(\n    viewController: UIViewController,\n    buttonAlignment: UILayoutConstraintAxis = .vertical,\n    transitionStyle: PopupDialogTransitionStyle = .bounceUp,\n    preferredWidth: CGFloat = 340,\n    tapGestureDismissal: Bool = true,\n    panGestureDismissal: Bool = true,\n    hideStatusBar: Bool = false,\n    completion: (() -> Void)? = nil) \n```\n\nYou can pass your own view controller to PopupDialog (see image two). It is accessible via the `viewController` property of PopupDialog, which has to be casted to your view controllers class to access its properties. Make sure the custom view defines all constraints needed, so you don't run into any autolayout issues.\n\nButtons are added below the controllers view, however, these buttons are optional. If you decide to not add any buttons, you have to take care of dismissing the dialog manually. Being a subclass of view controller, this can be easily done via `dismissViewControllerAnimated(flag: Bool, completion: (() -> Void)?)`.\n\n## Button Alignment\n\nButtons can be distributed either `.horizontal` or `.vertical`, with the latter being the default. Please note distributing buttons horizontally might not be a good idea if you have more than two buttons.\n\n```swift\npublic enum UILayoutConstraintAxis : Int {\n\tcase horizontal\n\tcase vertical\n}\n```\n\n## Transition Style\n\nYou can set a transition animation style with `.bounceUp` being the default. The following transition styles are available\n\n```swift\npublic enum PopupDialogTransitionStyle: Int {\n    case bounceUp\n    case bounceDown\n    case zoomIn\n    case fadeIn\n}\n```\n\n## Preferred Width\n\nPopupDialog will always try to have a max width of 340 . On iPhones with smaller screens, like iPhone 5 SE, width would be 320.\n340 is also the standard width for iPads. By setting preferredWidth you can override the max width of 340 for iPads only.\n\n## Gesture Dismissal\n\nGesture dismissal allows your dialog being dismissed either by a background tap or by swiping the dialog down. By default, this is set to `true`. You can prevent this behavior by setting either `tapGestureDismissal` or `panGestureDismissal`  to `false` in the initializer.\n\n## Hide Status Bar\n\nPopupDialog can hide the status bar whenever it is displayed. Defaults to `false`. Make sure to add `UIViewControllerBasedStatusBarAppearance` to `Info.plist` and set it to `YES`.\n\n## Completion\nThis completion handler is called when the dialog was dismissed. This is especially useful for catching a gesture dismissal.\n\n\u003Cp>&nbsp;\u003C\u002Fp>\n\n# Default Dialog Properties\n\nIf you are using the default dialog, you can change selected properties at runtime:\n\n```swift\n\u002F\u002F Create the dialog\nlet popup = PopupDialog(title: title, message: message, image: image)\n\n\u002F\u002F Present dialog\nself.present(popup, animated: true, completion: nil)\n\n\u002F\u002F Get the default view controller and cast it\n\u002F\u002F Unfortunately, casting is necessary to support Objective-C\nlet vc = popup.viewController as! PopupDialogDefaultViewController\n\n\u002F\u002F Set dialog properties\nvc.image = UIImage(...)\nvc.titleText = \"...\"\nvc.messageText = \"...\"\nvc.buttonAlignment = .horizontal\nvc.transitionStyle = .bounceUp\n```\n\n\u003Cp>&nbsp;\u003C\u002Fp>\n\n# Styling PopupDialog\n\nAppearance is the preferred way of customizing the style of PopupDialog.\nThe idea of PopupDialog is to define a theme in a single place, without having to provide style settings with every single instantiation. This way, creating a PopupDialog requires only minimal code to be written and no \"wrappers\".\n\nThis makes even more sense, as popup dialogs and alerts are supposed to look consistent throughout the app, that is, maintain a single style.\n\n## Dialog Default View Appearance Settings\n\nIf you are using the default popup view, the following appearance settings are available:\n\n```swift\nlet dialogAppearance = PopupDialogDefaultView.appearance()\n\ndialogAppearance.backgroundColor      = .white\ndialogAppearance.titleFont            = .boldSystemFont(ofSize: 14)\ndialogAppearance.titleColor           = UIColor(white: 0.4, alpha: 1)\ndialogAppearance.titleTextAlignment   = .center\ndialogAppearance.messageFont          = .systemFont(ofSize: 14)\ndialogAppearance.messageColor         = UIColor(white: 0.6, alpha: 1)\ndialogAppearance.messageTextAlignment = .center\n```\n\n## Dialog Container Appearance Settings\n\nThe container view contains the PopupDialogDefaultView or your custom view controller. the following appearance settings are available:\n\n```swift\nlet containerAppearance = PopupDialogContainerView.appearance()\n\ncontainerAppearance.backgroundColor = UIColor(red:0.23, green:0.23, blue:0.27, alpha:1.00)\ncontainerAppearance.cornerRadius    = 2\ncontainerAppearance.shadowEnabled   = true\ncontainerAppearance.shadowColor     = .black\ncontainerAppearance.shadowOpacity   = 0.6\ncontainerAppearance.shadowRadius    = 20\ncontainerAppearance.shadowOffset    = CGSize(width: 0, height: 8)\ncontainerAppearance.shadowPath      = CGPath(...)\n```\n\n## Overlay View Appearance Settings\n\nThis refers to the view that is used as an overlay above the underlying view controller but below the popup dialog view. If that makes sense ;)\n\n```swift\nlet overlayAppearance = PopupDialogOverlayView.appearance()\n\noverlayAppearance.color           = .black\noverlayAppearance.blurRadius      = 20\noverlayAppearance.blurEnabled     = true\noverlayAppearance.liveBlurEnabled = false\noverlayAppearance.opacity         = 0.7\n```\n\n#### Note\nSetting `liveBlurEnabled` to true, that is enabling realtime updates of the background view, results in a significantly higher CPU usage \u002Fpower consumption and is therefore turned off by default. Choose wisely whether you need this feature or not ;)\n\n## Button Appearance Settings\n\nThe standard button classes available are `DefaultButton`, `CancelButton` and `DestructiveButton`. All buttons feature the same appearance settings and can be styled separately.\n\n```swift\nvar buttonAppearance = DefaultButton.appearance()\n\n\u002F\u002F Default button\nbuttonAppearance.titleFont      = .systemFont(ofSize: 14)\nbuttonAppearance.titleColor     = UIColor(red: 0.25, green: 0.53, blue: 0.91, alpha: 1)\nbuttonAppearance.buttonColor    = .clear\nbuttonAppearance.separatorColor = UIColor(white: 0.9, alpha: 1)\n\n\u002F\u002F Below, only the differences are highlighted\n\n\u002F\u002F Cancel button\nCancelButton.appearance().titleColor = .lightGray\n\n\u002F\u002F Destructive button\nDestructiveButton.appearance().titleColor = .red\n```\n\nMoreover, you can create a custom button by subclassing `PopupDialogButton`. The following example creates a solid blue button, featuring a bold white title font. Separators are invisible.\n\n```swift\npublic final class SolidBlueButton: PopupDialogButton {\n\n    override public func setupView() {\n        defaultFont           = .boldSystemFont(ofSize: 16)\n        defaultTitleColor     = .white\n        defaultButtonColor    = .blue\n        defaultSeparatorColor = .clear\n        super.setupView()\n    }\n}\n\n```\n\nThese buttons can be customized with the appearance settings given above as well.\n\n\u003Cp>&nbsp;\u003C\u002Fp>\n\n## Dark mode example\n\nThe following is an example of a *Dark Mode* theme. You can find this in the Example project `AppDelegate`, just uncomment it to apply the custom appearance.\n\n```swift\n\u002F\u002F Customize dialog appearance\nlet pv = PopupDialogDefaultView.appearance()\npv.titleFont    = UIFont(name: \"HelveticaNeue-Light\", size: 16)!\npv.titleColor   = .white\npv.messageFont  = UIFont(name: \"HelveticaNeue\", size: 14)!\npv.messageColor = UIColor(white: 0.8, alpha: 1)\n\n\u002F\u002F Customize the container view appearance\nlet pcv = PopupDialogContainerView.appearance()\npcv.backgroundColor = UIColor(red:0.23, green:0.23, blue:0.27, alpha:1.00)\npcv.cornerRadius    = 2\npcv.shadowEnabled   = true\npcv.shadowColor     = .black\n\n\u002F\u002F Customize overlay appearance\nlet ov = PopupDialogOverlayView.appearance()\nov.blurEnabled     = true\nov.blurRadius      = 30\nov.liveBlurEnabled = true\nov.opacity         = 0.7\nov.color           = .black\n\n\u002F\u002F Customize default button appearance\nlet db = DefaultButton.appearance()\ndb.titleFont      = UIFont(name: \"HelveticaNeue-Medium\", size: 14)!\ndb.titleColor     = .white\ndb.buttonColor    = UIColor(red:0.25, green:0.25, blue:0.29, alpha:1.00)\ndb.separatorColor = UIColor(red:0.20, green:0.20, blue:0.25, alpha:1.00)\n\n\u002F\u002F Customize cancel button appearance\nlet cb = CancelButton.appearance()\ncb.titleFont      = UIFont(name: \"HelveticaNeue-Medium\", size: 14)!\ncb.titleColor     = UIColor(white: 0.6, alpha: 1)\ncb.buttonColor    = UIColor(red:0.25, green:0.25, blue:0.29, alpha:1.00)\ncb.separatorColor = UIColor(red:0.20, green:0.20, blue:0.25, alpha:1.00)\n\n```\n\n\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FOrderella\u002FPopupDialog\u002Fblob\u002Fmaster\u002FAssets\u002FPopupDialogDark01.png?raw=true\" width=\"260\">\n\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FOrderella\u002FPopupDialog\u002Fblob\u002Fmaster\u002FAssets\u002FPopupDialogDark02.png?raw=true\" width=\"260\">\n\nI can see that there is room for more customization options. I might add more of them over time.\n\n\u003Cp>&nbsp;\u003C\u002Fp>\n\n# Screen sizes and rotation\n\nRotation and all screen sizes are supported. However, the dialog will never exceed a width of 340 points on iPhones. For iPads, you can set `preferredWidth` when initializing a new PopupDialog. However, landscape mode will not work well if the height of the dialog exceeds the width of the screen.\n\n\u003Cp>&nbsp;\u003C\u002Fp>\n\n# Working with text fields\n\nIf you are using text fields in your custom view controller, popup dialog makes sure that the dialog is positioned above the keyboard whenever it appears. You can opt out of this behaviour by setting `keyboardShiftsView` to false on a PopupDialog.\n\n# Testing\n\nPopupDialog exposes a nice and handy method that lets you trigger a button tap programmatically:\n\n```swift\npublic func tapButtonWithIndex(_ index: Int)\n```\n\nOther than that, PopupDialog unit tests are included in the root folder.\n\n\u003Cp>&nbsp;\u003C\u002Fp>\n\n# Objective-C\n\nPopupDialog can be used in Objective-C projects as well.\nHere is a basic example:\n\n```objective-c\nPopupDialog *popup = [[PopupDialog alloc] initWithTitle: @\"Title\"\n                                                message: @\"This is a message\"\n                                                  image: nil\n                                        buttonAlignment: UILayoutConstraintAxisVertical\n                                        transitionStyle: PopupDialogTransitionStyleBounceUp\n                                         preferredWidth: 380\n                                    tapGestureDismissal: NO\n                                    panGestureDismissal: NO\n                                          hideStatusBar: NO\n                                             completion: nil];\n\nDestructiveButton *delete = [[DestructiveButton alloc] initWithTitle: @\"Delete\"\n                                                              height: 45\n                                                        dismissOnTap: YES\n                                                              action: nil];\n\nCancelButton *cancel = [[CancelButton alloc] initWithTitle: @\"Cancel\"\n                                                    height: 45\n                                              dismissOnTap: YES\n                                                    action: nil];\n\nDefaultButton *ok = [[DefaultButton alloc] initWithTitle: @\"OK\"\n                                                  height: 45\n                                            dismissOnTap: YES\n                                                  action: nil];\n\n[dialog addButtons:@[delete, cancel, ok]];\n\n[self presentViewController:popup animated:YES completion:nil];\n```\n\n\n\u003Cp>&nbsp;\u003C\u002Fp>\n\n\n# Bonus\n\n## Shake animation\n\nIf you happen to use PopupDialog to validate text input, for example, you can call the handy `shake()` method on PopupDialog.\n\n\u003Cp>&nbsp;\u003C\u002Fp>\n\n# Requirements\n\nMinimum requirement is iOS 10.0. This dialog was written with Swift 5, for support of older versions please head over to releases.\n\n\u003Cp>&nbsp;\u003C\u002Fp>\n\n# Changelog\n* **1.1.1** Updates dependencies to Swift 5\n* **1.1.0** Swift 5 support\n* **1.0.0** Pinned Swift version to 4.2\u003Cbr>Dropped iOS 9 support as of moving to ios-snapshot-test-case\n* **0.9.2** Fixes crash when presenting dialog while app is inactive\n* **0.9.1** Fixes Carthage support\n* **0.9.0** Swift 4.2 support\n* **0.8.1** Added shadow appearance properties\n* **0.8.0** Separated tap and pan gesture dismissal\n* **0.7.1** Fixes Objective-C compatability\u003Cbr>Improved Carthage handling\n* **0.7.0** Removed FXBlurView while switching to DynamicBlurView\n* **0.6.2** Added preferredWidth option for iPads\n* **0.6.1** Added shake animation\u003Cbr>Introduced hideStatusBar option\n* **0.6.0** Swift 4 support\u003Cbr>Dropped iOS8 compatibility\n* **0.5.4** Fixed bug where blur view would reveal hidden layer\u003Cbr>Improved view controller lifecycle handling\u003Cbr>Scroll views can now be used with gesture dismissal\n* **0.5.3** Fixed memory leak with custom view controllers\u003Cbr>Added UI automation & snapshot tests\n* **0.5.2** Fixed image scaling for default view\n* **0.5.1** Introduced custom button height parameter\u003Cbr>Reintroduced iOS8 compatibility\n* **0.5.0** Swift 3 compatibility \u002F removed iOS8\n* **0.4.0** iOS 8 compatibility\n* **0.3.3** Fixes buttons being added multiple times\n* **0.3.2** Dialog repositioning when interacting with keyboard\u003Cbr>Non dismissable buttons option\u003Cbr>Additional completion handler when dialog is dismissed\n* **0.3.1** Fixed Carthage issues\n* **0.3.0** Objective-C compatibility\n* **0.2.2** Turned off liveBlur by default to increase performance\n* **0.2.1** Dismiss via background tap or swipe down transition\n* **0.2.0** You can now pass custom view controllers to the dialog. This introduces breaking changes.\n* **0.1.6** Defer button action until animation completes\n* **0.1.5** Exposed dialog properties\u003Cbr>(titleText, messageText, image, buttonAlignment, transitionStyle)\n* **0.1.4** Pick transition animation style\n* **0.1.3** Big screen support\u003Cbr>Exposed basic shadow appearance\n* **0.1.2** Exposed blur and overlay appearance\n* **0.1.1** Added themeing example\n* **0.1.0** Intitial version\n\n\u003Cp>&nbsp;\u003C\u002Fp>\n\n# Author\n\nMartin Wildfeuer, mwfire@mwfire.de\nfor Orderella Ltd., [orderella.co.uk](http:\u002F\u002Forderella.co.uk)\u003Cbr>\nYou might also want to follow us on Twitter, [@theMWFire](https:\u002F\u002Ftwitter.com\u002FtheMWFire) | [@Orderella](https:\u002F\u002Ftwitter.com\u002Forderella)\n\n# Thank you\nThanks to everyone who uses, enhances and improves this library, especially the contributors.\nMoreover, thanks to KyoheiG3 for porting FXBlurView to [DynamicBlurView](https:\u002F\u002Fgithub.com\u002FKyoheiG3\u002FDynamicBlurView).\n\n\u003Cp>&nbsp;\u003C\u002Fp>\n\n# License\n\nPopupDialog is available under the MIT license. See the LICENSE file for more info.\n","PopupDialog 是一个用 Swift 编写的简单可自定义的弹出对话框库，用于替代 UIAlertController 的 alert 样式。它支持自定义视图控制器、平滑过渡动画以及全面的主题定制功能，包括字体、颜色、圆角半径、阴影等。此外，该库还允许通过滑动和背景点击来关闭对话框，并且兼容 Objective-C。适用于需要在 iOS 应用中展示信息提示或获取用户反馈的各种场景，特别是在追求界面美观与交互流畅性的应用开发中。","2026-06-11 03:09:31","top_language"]