DWAlertController 0.2.1

DWAlertController 0.2.1

Andrew Podkovyrin 维护。




DWAlertController

CI Status Version Carthage Compatible Accio supported License Platform

你上次对设计师说无法定制 UIAlertController 什么时候了?现在可以了。无需使用任何私有 API。

DWAlertController 是一个 UIAlertController,它支持显示任何视图控制器而不是标题和消息。DWAlertController 完全复制了 UIAlertController 的外观和感觉,并且具有相同的 API。

DWAlertController Screenshots

这个警报已在我们的应用程序 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 相当的出色外观。

  1. 为警报后面的视图创建一个屏幕截图,并将其应用于 CIFilter 带有 CIOverlayBlendMode。这种方法实现的视觉效果与 UIAlertController 最接近。然而,有几个原因导致此方法不能使用。在演示过程中截图会增加明显的延迟,而且也无法在演示之后进行截图,这可能会导致警报后面内容闪烁。此外,当用户旋转屏幕时,还需要进行截图,这也会导致延迟。
  2. 在警报后面的暗色视图中创造一个“洞”,并允许 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安装

  1. 在您的Package.swift中添加以下内容
    .package(url: "https://github.com/podkovyrin/DWAlertController.git", .upToNextMajor(from: "0.2.1")),
  2. 接下来,将DWAlertController添加到您的App目标的依赖项中,如下所示
    .target(name: "App", dependencies: ["DWAlertController"]),
  3. 然后运行accio update

作者

Andrew Podkovyrin, [email protected]

许可协议

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