一个 SwiftUI 组件,比原生的 Stepper 组件更容易输入数字。除了增量和减量按钮外,用户可以点击数字使用键盘进行更改,或者长按其中一个按钮以持续执行操作直到释放。
已在 iOS 16.0 上测试,但应该适用于 iOS 和 iPadOS 15 及更高版本。
创建一个 TextFieldStepper 非常简单。
struct ContentView: View {
@State private var butter = 0.0
var body: some View {
TextFieldStepper(
doubleValue: $butter,
unit: "oz",
label: "Butter"
)
}
}
默认设置在大多数情况下应该都没问题,但肯定会有不适用的情况。有两种方法可以更改这些参数。
如果只想修改单个组件,可以直接传入参数名称和值。
struct ContentView: View {
@State private var butter = 0.0
var body: some View {
TextFieldStepper(
doubleValue: $butter,
unit: "oz",
label: "Butter",
minimum: 5.0,
maximum: 25.0
)
}
}
如果想一次修改多个参数,请使用 TextFieldStepperConfig。您可以将不同的配置传递到组件的每个实例中,或者创建一个全局可用的配置作为默认设置。
struct ContentView: View {
@State private var butter = 0.0
let config = TextFieldStepperConfig(
unit: "oz",
label: "Butter",
minimum: 5.0,
maximum: 25.0
)
var body: some View {
TextFieldStepper(doubleValue: $butter, config: config)
}
}
以下是 TextFieldStepper 和 TextFieldStepperConfig 上可用的参数。
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| unit | String | “” | 显示在值后面的单位。 |
| label | String | “” | 显示在值下方的标签。 |
| increment | Double | 0.1 | 递增或递减的点数。 |
| minimum | Double | 0.0 | 接受的最小值。 |
| maximum | Double | 100.0 | 接受的最大值。 |
| decrementImage | TextFieldStepperImage | TextFieldStepperImage(systemName: "minus.circle.fill") | 减量按钮的图像。 |
| incrementImage | TextFieldStepperImage | TextFieldStepperImage(systemName: "plus.circle.fill") | 增量按钮的图像。 |
| declineImage | TextFieldStepperImage | TextFieldStepperImage(systemName: “xmark.circle.fill”, color: Color.red) | 拒绝按钮的图像。 |
| confirmImage | TextFieldStepperImage | TextFieldStepperImage(systemName: “checkmark.circle.fill”, color: Color.green) | 确认按钮的图像。 |
| disabledColor | Color | Color(UIColor.lightGray) | 禁用按钮的颜色。 |
| labelOpacity | Double | 1.0 | Double |
| labelColor | Color | .primary | 值下方标签的颜色。 |
| valueColor | Color | .primary | 值的颜色。 |
| shouldShowAlert | Bool | true | 由于错误导致值被默认时是否应显示警告。 |
| minimumDecimalPlaces | Int | 0 | 始终在值后显示的最小小数位数。 |
| maximumDecimalPlaces | Int | 8 | 允许在值后显示的最大小数位数。 |
以下是 TextFieldStepper 使用的默认颜色和图像。除此之外,当按钮被禁用时,它将使用 Color(UIColor.lightGray),可以使用 disabledColor 参数覆盖。您还可以使用 labelOpacity 和 labelColor 指定标签的透明度和颜色。如果您想更改主要值的颜色,请使用 valueColor。
| 按钮 | Color | 图像 |
|---|---|---|
| decrementButton | .accentColor | minus.circle.fill |
| incrementButton | .accentColor | plus.circle.fill |
| declineButton | .red | xmark.circle.fill |
| confirmButtton | .green | checkmark.circle.fill |
您可以通过创建 TextFieldStepperImage 的实例并将其传递给 TextFieldStepper 或 TextFieldStepperConfig 上的相应参数来覆盖默认图像。有两种实例化 TextFieldStepperImage 的方法。目前没有只更改颜色的方法,您必须同时提供图像。
如果您只是使用系统命名的图像,可以使用 systemName 参数。
let image = TextFieldStepperImage(systemName: "circle.fill")
如果您使用自定义图像,请直接传递一个 Image。
let image = TextFieldStepperImage(image: Image(systemName: "circle.fill")
iOS 在隐藏键盘方面处理不佳,因此 TextFieldStepper 包含一个名为 .closeKeyboard(on: ) 的修饰符来改善这种情况。您不需要指定 on 参数,默认情况下它将启用滑动和点击手势。如果您只想使用一个手势,您可以提供 .Tap 或 .Swipe。
此修饰符应与您希望发生交互的特定视图相关联,不要将其放置在最高执行级别,否则可能无法按您的预期工作。
TextFieldStepper 期望的基础值是 Double,当然有时会导致浮点数问题。该组件本身不会修改该值,但是对于验证检查,它将被.rounded()到 9 位小数。然后在文本格式中显示的值会被截断为 8 位小数,但是可以使用 maximumDecimalPlaces 参数更改此值。这在几乎所有情况下都不应该是一个问题,但我只是想为了透明起见而提及它。
MIT 许可证
版权所有 (c) 2022 Joe Scotto
特此授权,免费授予任何获取本软件和相关文档文件(“软件”)副本的人,不受限制地处理本软件,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售本软件副本的权利,并允许向其提供本软件的人这样做,但须满足以下条件:
上述版权声明和本许可声明应包含在本软件的所有副本或主要部分中。
本软件按“原样”提供,不作任何形式的明示或暗示的保证,包括但不限于适销性、特定用途适用性和非侵权性保证。在任何情况下,作者或版权持有者均不对任何索赔、损害或其他责任负责,无论是在合同诉讼、侵权诉讼或其他诉讼中,无论是因本软件或使用或其他处理本软件而引起的还是与之相关的。