SwiftUI中的Stepper(系统Stepper以及自定义Stepper)

2024-05-26 10:20

本文主要是介绍SwiftUI中的Stepper(系统Stepper以及自定义Stepper),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本篇文章主要介绍一下Stepper,这个组件在UIKit中也已经有较长的历史了,下面看看在SwiftUI中如何使用,有哪些更加便捷的方法呢?

Stepper减号(-)和加号(+)按钮,可以点击后以指定的数值进行加减。

基础初始化方法

Stepper提供了很多初始化方法,先从最简单的一个入手:
在这里插入图片描述

  @State private var stepperValue: Int = 18var body: some View {Stepper("Choose your age: \(stepperValue)", value: $stepperValue, in: 16...60, step: 1).foregroundColor(.red).font(.system(size: 22))
//      .fontWeight(.bold) // userd for iOS 16 or later.accentColor(.blue).padding()}

上面代码中我们设置了几个初始化参数:
titleKeyStepper组件左侧的提示文字。
value:一个被@State包装的属性值,用于记录Stepper的数值。
inStepper可以选择的范围,当达到最低数值时,减号变成disabled,当达到最大值时,加号变成disabled
step:每次加减的步长,即数值。

在这里可以设置提示文字的外观样式,比如foregroundColorfontfontWeight等等,不过有些修饰符是iOS 16之后才能用的,比如fontWeight
上面添加了accentColor修饰符,但是没有起作用,我们只能设置提示文字的样式,而右侧的加减小组建无法设置外观样式。

上面的初始化中提示文字的外观自定义还是比较有限的,下面的方法就自定义一个提示文字:
在这里插入图片描述

    Stepper(value: $stepperValue, in: 18...60, step: 1) {Text("My age is: \(value)").font(.system(size: 22)).fontWeight(.bold).foregroundColor(.white).padding(.horizontal).padding(.vertical, 5).background(Capsule().fill(Color.black.opacity(0.5)))}

该初始化方法中使用了label参数,这个参数是一个闭包,支持自定义一个提示文字,上面代码中通过Text组件配置了一个提示文字,Text组件的外观设置还是比较丰富的,效果图如上图。

onEditingChanged

Stepper的初始化方法中还提供了一个闭包onEditingChanged,当用户点击的时候调用。

    Stepper("Choose your age: \(stepperValue)", value: $stepperValue, in: 16...60, step: 1, onEditingChanged: { value inprint("---> value: \(value)")})

当用户按下或者长按的时候onEditingChanged返回的value值为true,当用户松手的时候,返回的value值为false.

onIncrement和onDecrement

如果在数值改变的时候,我们想做一些逻辑操作,那么就需要用到下面的初始化方法,该方法提供了onIncrementonDecrement两个闭包,分别在点击加号和减号的时候调用。比如下面这个示例:
在这里插入图片描述
上面示例中在点击Stepper的时候,对图形进行倒角设置。代码如下:

struct StepperDemo: View {@State private var stepperValue: Int = 50var body: some View {VStack(spacing: 40) {RoundedRectangle(cornerRadius: CGFloat(stepperValue)).frame(width: 200, height: 200)Stepper("The cornerRadius is: \(stepperValue)", onIncrement: {// IncrementonSteperChanged(10)}, onDecrement: {// DecrementonSteperChanged(-10)}).padding()}}func onSteperChanged(_ value: Int) {let newValue = stepperValue + valueif newValue < 0 || newValue > 100 {return}withAnimation(.easeInOut) {stepperValue = newValue}}
}
自定义Stepper

除了系统的Stepper,我们也可以仿照系统的自定义一个Stepper,下面就是自定义的Stepper以及完整代码。
在这里插入图片描述

struct StepperDemo: View {@State private var stepperValue: Int = 50var body: some View {VStack {MyStepper(value: $stepperValue, in: 0...100, label: { Text("Value: \(stepperValue)") }, style: DefaultStepperStyle())MyStepper(value: $stepperValue, in: 0...100, label: { Text("Value: \(stepperValue)") }, style: DefaultStepperStyle()).controlSize(.mini)MyStepper(value: $stepperValue, in: 0...100, label: { Text("Value: \(stepperValue)") }, style: CapsuleStepperStyle()).controlSize(.large).font(.largeTitle)}.padding()}
}

自定义Stepper组件:

import SwiftUIstruct MyStepper<Label: View, Style: MyStepperStyle>: View {@Binding var value: Intvar `in`: ClosedRange<Int> // todo@ViewBuilder var label: Labelvar style: Stylevar body: some View {style.makeBody(.init(value: $value, label: .init(underlyingLabel: AnyView(label)), range: `in`))}
}protocol MyStepperStyle {associatedtype Body: Viewfunc makeBody(_ configuration: MyStepperStyleConfiguration) -> Body
}extension MyStepperStyle where Self == DefaultStepperStyle {static var `default`: DefaultStepperStyle { return .init() }
}struct MyStepperStyleConfiguration {var value: Binding<Int>var label: Labelvar range: ClosedRange<Int>struct Label: View {var underlyingLabel: AnyViewvar body: some View {underlyingLabel}}
}struct DefaultStepperStyle: MyStepperStyle {func makeBody(_ configuration: MyStepperStyleConfiguration) -> some View {Stepper(value: configuration.value, in: configuration.range) {configuration.label}}
}struct CapsuleStepperStyle: MyStepperStyle {func makeBody(_ configuration: MyStepperStyleConfiguration) -> some View {CapsuleStepper(configuration: configuration)}
}struct CapsuleStepper: View {var configuration: MyStepperStyleConfiguration@Environment(\.controlSize)var controlSizevar padding: Double {switch controlSize {case .mini: return 4case .small: return 6default: return 8}}var body: some View {HStack {configuration.labelSpacer()HStack {Button("-") { configuration.value.wrappedValue -= 1 }Text(configuration.value.wrappedValue.formatted())Button("+") { configuration.value.wrappedValue += 1 }}.transformEnvironment(\.font, transform: { font inif font != nil { return }switch controlSize {case .mini: font = .footnotecase .small: font = .calloutdefault: font = .body}}).padding(.vertical, padding).padding(.horizontal, padding * 2).foregroundColor(.white).background {Capsule().fill(.tint)}}.buttonStyle(.plain)}
}

自定义的Stepper组件这里就不做过多的说明了,仅供大家参考,有需要的朋友可以研究研究。

最后,希望能够帮助到有需要的朋友,如果觉得有帮助,还望点个赞,添加个关注,笔者也会不断地努力,写出更多更好用的文章。

这篇关于SwiftUI中的Stepper(系统Stepper以及自定义Stepper)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1004194

相关文章

Linux系统之authconfig命令的使用解读

《Linux系统之authconfig命令的使用解读》authconfig是一个用于配置Linux系统身份验证和账户管理设置的命令行工具,主要用于RedHat系列的Linux发行版,它提供了一系列选项... 目录linux authconfig命令的使用基本语法常用选项示例总结Linux authconfi

SpringBoot自定义注解如何解决公共字段填充问题

《SpringBoot自定义注解如何解决公共字段填充问题》本文介绍了在系统开发中,如何使用AOP切面编程实现公共字段自动填充的功能,从而简化代码,通过自定义注解和切面类,可以统一处理创建时间和修改时间... 目录1.1 问题分析1.2 实现思路1.3 代码开发1.3.1 步骤一1.3.2 步骤二1.3.3

dubbo3 filter(过滤器)如何自定义过滤器

《dubbo3filter(过滤器)如何自定义过滤器》dubbo3filter(过滤器)类似于javaweb中的filter和springmvc中的intercaptor,用于在请求发送前或到达前进... 目录dubbo3 filter(过滤器)简介dubbo 过滤器运行时机自定义 filter第一种 @A

Nginx配置系统服务&设置环境变量方式

《Nginx配置系统服务&设置环境变量方式》本文介绍了如何将Nginx配置为系统服务并设置环境变量,以便更方便地对Nginx进行操作,通过配置系统服务,可以使用系统命令来启动、停止或重新加载Nginx... 目录1.Nginx操作问题2.配置系统服android务3.设置环境变量总结1.Nginx操作问题

CSS3 最强二维布局系统之Grid 网格布局

《CSS3最强二维布局系统之Grid网格布局》CS3的Grid网格布局是目前最强的二维布局系统,可以同时对列和行进行处理,将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局,本文介... 深入学习 css3 目前最强大的布局系统 Grid 网格布局Grid 网格布局的基本认识Grid 网

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

CentOS系统Maven安装教程分享

《CentOS系统Maven安装教程分享》本文介绍了如何在CentOS系统中安装Maven,并提供了一个简单的实际应用案例,安装Maven需要先安装Java和设置环境变量,Maven可以自动管理项目的... 目录准备工作下载并安装Maven常见问题及解决方法实际应用案例总结Maven是一个流行的项目管理工具

CSS自定义浏览器滚动条样式完整代码

《CSS自定义浏览器滚动条样式完整代码》:本文主要介绍了如何使用CSS自定义浏览器滚动条的样式,包括隐藏滚动条的角落、设置滚动条的基本样式、轨道样式和滑块样式,并提供了完整的CSS代码示例,通过这些技巧,你可以为你的网站添加个性化的滚动条样式,从而提升用户体验,详细内容请阅读本文,希望能对你有所帮助...

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬