Placard 是一个小型且易于使用的包,用于使用 SwiftUI 呈现动画消息栏。
消息视图可以显示在屏幕的顶部、底部或中心,并且可以使用 UIEdgeInsets 从屏幕边缘和垂直位置偏移。
具有交互式的显示、点击和关闭手势 - 一系列动画主题可供选择(或者如果您需要,可以选择无动画)。
Placard 允许您为基于优先级的消息等内容选择默认消息主题,但也提供通过参数、配置对象进行的自定义,或者您可以使用自己的 SwiftUI 视图并让 Placard 控制其动画和外观。 可以配置 Placard 以显示任意时间段(默认情况下,它会永远显示 - 或者直到用户点击它)。 此外,所有 Placard 消息都可以指定一个在用户点击时执行的动作(但如果 Placard 通过超时自动关闭,则不会)。
标语牌会自动重绘自身,以适应设备方向的变化
Placard 仅针对 iOS 17.2 及更高版本构建和测试。
PlacardDemo 应用程序 允许您探索 Placard,包括默认选项和通过更改配置进行探索
下载此存储库的 zip 文件并将其解压缩。 运行 PlacardDemo.xcodeproj 并选择 iphone 或 ipad 作为模拟器的目标(请参阅“要求”部分,了解所需的 xcode 构建)。
本文档中 Placard 的图片全部取自 PlacardDemo 项目的屏幕截图。
要通过演示界面试用 Placard,请参阅上面的部分。 但是,如果您想在自己的项目中使用 Placard,请通过 Swift Package Manager 或手动下载 Placard
转到 Xcode 中的 File | Swift Packages | Add Package Dependency... 并搜索“Placard”。
从 Swift Package Index 获取 Placard
使用 Placard 很简单,但了解 Placard 由您可以使用的三个视图组成会有所帮助
Placard 类型采用类型为 PlacardConfig 的配置,您可以使用它来更改 Placard 视图的行为、位置和格式。 配置不是必需的,但允许您自定义 Placard。
Placard 配置的协议是 PlacardConfigP
public protocol PlacardConfigP {
var backgroundColor: UIColor? { get }
var primaryFont: UIFont? { get }
var secondaryFont: UIFont? { get }
var accentColor: UIColor? { get }
var titleTextColor: UIColor? { get }
var placement: PlacardPlacement? { get }
var insets: UIEdgeInsets? { get }
var showAnimation: TransitionAnimation? { get }
var hideAnimation: TransitionAnimation? { get }
var tapAnimation: TapAnimation? { get }
var fadeAnimation: Bool? { get }
}
以下是对这些属性的描述
配置属性 | 描述 |
---|---|
backgroundColor | Placard 视图的背景颜色(作为 UIColor) |
primaryFont | 标题的字体 |
secondaryFont | 状态消息的字体 |
accentColor | Placard 视图的强调色(作为 UIColor)(用于状态消息的前景色) |
titleTextColor | 用于 Placard 视图标题和 systemImage 前景颜色的颜色(作为 UIColor) |
placement | 在设备屏幕上放置 Placard 视图的位置 |
insets | 用于从其 PlacardPlacement 偏移 Placard 视图的 UIEdgeInsets |
showAnimation | Placard 视图出现时要使用的动画 |
hideAnimation | Placard 视图消失时要使用的动画 |
tapAnimation | 用户点击 Placard 视图时要使用的动画 |
fadeAnimation | 如果为 true,则显示和隐藏动画将分别淡入或淡出 |
在下面的示例中,所有可用的配置选项都已设置
let config = PlacardConfig(backgroundColor: .darkGray,
primaryFont: UIFont.systemFont(ofSize: 30.0, weight: .heavy),
secondaryFont: UIFont.systemFont(ofSize: 16.0, weight: .regular),
accentColor: .red,
titleTextColor: .yellow,
placement: .top,
insets: UIEdgeInsets(top: 50, left: 20, bottom: 0, right: 20),
showAnimation: .spin,
hideAnimation: .fade,
tapAnimation: .pulseIn,
fadeAnimation: true)
其中两个属性,Insets 和 Animations,需要更详细的说明
用于从其 PlacardPlacement 偏移 Placard 视图的 UIEdgeInsets。 请记住,UIEdgeInsets.left 和 UIEdgeInsets.right 的作用是将 Placard 视图从设备屏幕的边缘“推开”(允许用户创建不跨越屏幕的 Placard)。 此外,所有值都应该是正偏移量 - UIEdgeInsets.top 的值为 50 会将 Placard 视图从设备顶部推送 50 个点(无论其方向如何)。 UIEdgeInsets.bottom 的值为 50 会将 Placard 视图从设备底部推送 50 个点(朝向中心)。
Note that for:
- PlacardPlacement.top - UIEdgeInsets.bottom is ignored
- PlacardPlacement.bottom - UIEdgeInsets.top is ignored
这些是在标语牌显示和隐藏时发生的动画过渡的类型。 可用选项包括
public enum TransitionAnimation {
case none, fade, rollUp, rollDown, floatUp, floatDown, floatLeft, floatRight, toX, toY, toPoint, spin, spinOnX, spinOnY
}
这些是用户点击标语牌时发生的动画(随后是动作完成和标语牌的关闭)。 可用选项包括
public enum TapAnimation {
case none, pulseIn, pulseOut, zoomInWithEasing, zoomOutWithEasing
}
通过动画 gif 很难看到差异,但请使用 PlacardDemo 应用程序来更清楚地了解这些差异。
缩小,缓入
放大,缓出
脉冲发出
脉冲进入
使用配置的另一种方法 - 使用枚举。 这基本上与使用 PlacardConfig 实例相同,但是您可以定义一个配置类型(符合 PlacardConfigP)并将其传递进去。
enum Custom: PlacardConfigP {
// the type we are defining
case terminal
var backgroundColor: UIColor? {
switch self { case .terminal: return .lightGray }
}
var accentColor: UIColor? {
switch self {
case .terminal: return .purple
}
}
var primaryFont: UIFont? {
switch self {
case .terminal: return UIFont(name: "HelveticaNeue-Light", size: 24.0)
}
}
var secondaryFont: UIFont? {
switch self {
case .terminal: return UIFont(name: "HelveticaNeue-Light", size: 16.0)
}
}
var titleTextColor: UIColor? {
switch self { case .terminal: return .green }
}
var placement: PlacardPlacement? {
switch self { default: return .center }
}
var insets: UIEdgeInsets? {
switch self { default: return UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20) }
}
var showAnimation: TransitionAnimation? {
switch self { default: return .spinOnX }
}
var hideAnimation: TransitionAnimation? {
switch self { default: return .spinOnY }
}
var tapAnimation: TapAnimation? {
switch self { default: return .zoomOutWithEasing }
}
var fadeAnimation: Bool? {
switch self { default: return true }
}
}
它将像这样使用
PlacardView(
title: "You Dawg!",
statusMessage: "Git that squeaky!",
systemImageName: "pawprint",
config: Custom.terminal
)
PlacardPriorityView 类型是内置的 Placard,旨在用于基于优先级的用户状态消息。 您可以通过 PlacardPriorityView 的参数更改消息的标题和正文,以及图像。 您还可以传入自己的配置来更改更多内容(请参阅上面的配置部分)。 但这些旨在快速轻松地表示状态。
您可以更改以下任何参数,但只有 title 和 statusMessage 是必需的。
参数 | 类型 | 描述 |
---|---|---|
title | String | 标语牌的标题 |
statusMessage | String | 标语牌的状态消息 |
systemImageName | String | 要用作图标的系统图像(SF 符号)的名称 |
config | PlacardConfig | 配置文件(请参阅上面的部分) |
duration | Double | 标语牌要显示的秒数 |
action | () -> Void | 用户点击标语牌时要执行的动作 |
priority | PlacardPriority | .success、.info、.warning、.error 或 .default 优先级 |
在这里,我们使用我们自己的标题和状态消息创建一个成功消息
PlacardPriorityView(title: "Success!",
statusMessage: "Some status message",
priority: .success)
PlacardView 类型与 PlacardPriorityView 类型相似,但没有与其关联的优先级。 它可以以相同的方式进行自定义。
其可用的参数集为
参数 | 类型 | 描述 |
---|---|---|
title | String | 标语牌的标题 |
statusMessage | String | 标语牌的状态消息 |
systemImageName | String | 要用作图标的系统图像(SF 符号)的名称 |
config | PlacardConfig | 配置文件(请参阅上面的部分) |
duration | Double | 标语牌要显示的秒数 |
action | () -> Void | 用户点击标语牌时要执行的动作 |
在这里,我们传入我们自己的 systemImage 来显示
PlacardView(title: "Don't forget to smile!",
statusMessage: "Teeth are like bats that hang from your gums.",
systemImageName: "mouth.fill")
Placard 接受一个动作(类型为 () -> Void),以便在点击时执行(仅当点击时 - 如果您设置了持续时间并且 Placard 在用户点击之前过期,则不会触发该动作)。
PlacardView(title: "Don't forget to smile!",
statusMessage: "Teeth are like bats that hang from your gums.",
systemImageName: "face.smiling",
action: { print("You tapped me!") })
当您想在使用 Placard 的功能的同时提供自己的 SwiftUI 视图时,您将使用 PlacardCustomView。
PlacardCustomView 的可用参数集为
参数 | 类型 | 描述 |
---|---|---|
title | String | 标语牌的标题 |
statusMessage | String | 标语牌的状态消息 |
content | UIView | 您的 SwiftUI 视图 |
config | PlacardConfig | 配置文件(请参阅上面的部分) |
duration | Double | 标语牌要显示的秒数 |
action | () -> Void | 用户点击标语牌时要执行的动作 |
定义您自己的 SwiftUI 视图以用作标语牌。 这是一个例子
struct ViewWithButton: View {
@State var action: Bool
var body: some View {
var color: String {
if action { return "red" }
return "green"
}
VStack {
Text("Make me see \\(color)")
.background(action ? .green : .red)
Button(action: {
action.toggle()
}) {
HStack {
Image(systemName: "face.dashed")
.font(.title)
.foregroundColor(action ? .green : .red)
Text("change me")
.fontWeight(.semibold)
.font(.title)
}
.padding()
.foregroundColor(.white)
.background(Color.black)
.cornerRadius(40)
}
}
.frame(maxWidth: .infinity, minHeight: 200, alignment: .center)
.background(Color(red: 155/255, green: 198/255, blue: 222/255))
}
}
将该视图传递到 PlacardCustomView 实例中
PlacardCustomView(title: "some title", statusMessage: "some body", config: custom_config) {
// SwiftUI view
ViewWithButton(action: toggle)
}