DWAlertController
你上次对设计师说无法定制 UIAlertController 什么时候了?现在可以了。无需使用任何私有 API。
DWAlertController 是一个 UIAlertController,它支持显示任何视图控制器而不是标题和消息。DWAlertController 完全复制了 UIAlertController 的外观和感觉,并且具有相同的 API。
这个警报已在我们的应用程序 Dash Wallet 中投入生产使用。
支持的功能
- iPhone / iPad 兼容
- 设备旋转
- 键盘支持
- 可定制的操作按钮(正常/禁用/破坏性着色颜色)
- 轻触并滑动操作按钮
- 自定义展示和消失过渡(对应于
UIAlertController
的那些) - 在警报后面的 tintColor-ed 视图进行暗淡
- 单次
DWAlertController
内部从一个内容控制器到另一个内容控制器的简单内置过渡(请参见示例应用程序中的高级警报) - 动态类型
- 无障碍
- 暗黑模式以及 iOS 12 或更低版本的暗黑外观
用法
DWAlertController 使用 Objective-C 编写并针对 Swift 进行优化。DWAlertController 提供的所有 API 都与 UIAlertController
相同。
Swift
let controller = ... // instantiate view controller
let alert = DWAlertController(contentController: controller)
let okAction = DWAlertAction(title: NSLocalizedString("OK", comment: ""),
style: .cancel,
handler: nil)
alert.addAction(okAction)
present(alert, animated: true)
Objective-C
UIViewController *controller = ...; // instantiate view controller
DWAlertController *alert = [DWAlertController alertControllerWithContentController:controller];
DWAlertAction *okAction = [DWAlertAction actionWithTitle:NSLocalizedString(@"OK", nil)
style:DWAlertActionStyleCancel
handler:nil];
[alert addAction:okAction];
[self presentViewController:alert animated:YES completion:nil];
重要说明
为了使 DWAlertController
与自定义内容控制器协同工作,内容控制器的视图必须正确实现自动布局。您可能在实现动态大小 UITableViewCell
时使用过同样的技术。更多信息请参阅 https://stackoverflow.com/a/18746930
由于 DWAlertController 内部维护大型内容控制器的滚动(就像 UIAlertController 一样),因此不需要在内容视图控制器内部放置UIScrollView。
内容控制器视图的 backgroundColor
应该是透明的(UIColor.clear
)。
限制
- 仅支持
UIAlertController.Style.alert
(因为有大量不错的 actionSheet 风格控件实现) - 不支持更新当前显示视图控制器的高度。但是,当使用
performTransition(toContentController:animated:)
方法显示新的控制器时,它可能有不同的高度。
要求
iOS 9 或更高版本。
备注
默认的 UIAlertController
通过使用私有 CoreAnimation 类 CABackdropLayer
来实现这样鲜艳且富有表现力的背景颜色,该类位于另一个私有类 _UIDimmingKnockoutBackdropView
的内部,并与 UIVisualEffectView
相结合。该层使用 CAFilter
并带有 "overlayBlendMode"
,以将效果应用于其后面的视图。欲了解更多信息,请参阅此 回答。
因为我们希望在生产环境中使用此警报,所以我们不能使用这些 API 中的任何一个。有两种可能的方法可以获得与使用私有 API 相当的出色外观。
- 为警报后面的视图创建一个屏幕截图,并将其应用于
CIFilter
带有CIOverlayBlendMode
。这种方法实现的视觉效果与UIAlertController
最接近。然而,有几个原因导致此方法不能使用。在演示过程中截图会增加明显的延迟,而且也无法在演示之后进行截图,这可能会导致警报后面内容闪烁。此外,当用户旋转屏幕时,还需要进行截图,这也会导致延迟。 - 在警报后面的暗色视图中创造一个“洞”,并允许
UIVisualEffectView
协助完成所有工作。作为一个暗色视图,我们使用CAShapeLayer
并带有可动画化的path
属性,以在旋转或键盘动画期间动态修改“洞”。虽然这不是绝对流畅的解决方案,但它几乎完美工作,外观与UIAlertController
非常相似。
所有颜色和布局常量都是从 UIAlertController
仔细复制的。
示例
要运行示例项目,请先克隆仓库,然后在 Example 目录中首先运行 pod install
。
CocoaPods 集成
DWAlertController 可通过 CocoaPods 获得。要安装它,只需在 Podfile 中添加以下行
pod 'DWAlertController'
Carthage 集成
Carthage 是一个分布式依赖项管理器,它自动化了将框架添加到您的 Cocoa 应用程序的过程。
您可以使用以下命令通过Homebrew安装Carthage
$ brew update
$ brew install carthage
要使用Carthage将DWAlertController集成到您的Xcode项目中,请将其指定在您的Cartfile
中
github "podkovyrin/DWAlertController"
通过Accio安装
- 在您的
Package.swift
中添加以下内容.package(url: "https://github.com/podkovyrin/DWAlertController.git", .upToNextMajor(from: "0.2.1")),
- 接下来,将
DWAlertController
添加到您的App目标的依赖项中,如下所示.target(name: "App", dependencies: ["DWAlertController"]),
- 然后运行
accio update
。
作者
Andrew Podkovyrin, [email protected]
许可协议
DWAlertController可在MIT许可下使用。有关更多信息,请参阅LICENSE文件。