Skip to content

Switch 开关 ​

受控开关。@Binding var checked 双向绑定,轨道 2:1,圆点直径 = 高度 − 2 × switch.gap。

契约源:lh-ui-core/specs/switch.json · 黄金用例:lh-ui-core/cases/switch.json(6 条,已翻译为 XCTest,macOS 宿主即可运行)

状态 ​

开启时轨道为主色、圆点右移;关闭时轨道为描边色。loading 态在轨道内显示小型指示器且不响应切换。

9:41Switch 状态

HTML 模拟预览(iOS / SwiftUI 外观),非真机渲染

swift
@State private var on = true

LhSwitch(checked: $on) { newValue in
  // onChange
}

尺寸 ​

三档尺寸映射到 switch.width / switch.height 令牌,圆角随高度自动为轨道半径。

9:41Switch 尺寸

HTML 模拟预览(iOS / SwiftUI 外观),非真机渲染

加载态 ​

loading = true 时轨道内置 LhLoading(size: .small, tone: .primary),且点击被 gate 拦截 (黄金用例 loading-blocks-change)。

swift
LhSwitch(checked: $submitting, loading: submitting) { _ in }

API ​

Props ​

属性说明类型默认值
checked开关状态(受控双向绑定)Bool—
disabled是否禁用(不触发 onChange)Boolfalse
loading是否加载中(内置指示器,不触发 onChange)Boolfalse
size开关尺寸,映射到尺寸令牌LhSwitchSize.medium
onChange状态变化回调,payload 为新值((Bool) -> Void)?nil

LhSwitchSize ​

值widthheight圆点直径
.smallswitch.width.small(36pt)switch.height.small(20pt)height − 2 × switch.gap(16pt)
.mediumswitch.width.medium(44pt)switch.height.medium(24pt)height − 2 × switch.gap(20pt)
.largeswitch.width.large(52pt)switch.height.large(28pt)height − 2 × switch.gap(24pt)

颜色 ​

状态轨道圆点
关闭color.border.basecolor.onPrimary
开启color.primary.defaultcolor.onPrimary
禁用color.disabled.bgcolor.disabled.text

令牌对照 ​

令牌用途
switch.width.{small,medium,large}三档轨道宽度
switch.height.{small,medium,large}三档轨道高度
switch.gap圆点与轨道的内间距(决定圆点直径)
color.primary.default开启轨道色
color.border.base关闭轨道色
color.onPrimary圆点色
color.disabled.{bg,text}禁用态两色
motion.duration.base圆点滑动动画时长(iOS 端为秒)

黄金用例对照 ​

case id断言本地测试
tap-toggles-and-emits-onchange点击开启并回调 onChange(true)testDefaultIsInteractive
tap-checked-turns-off开启态点击变关闭testCheckedUsesPrimaryTrack
disabled-blocks-change禁用态不触发 onChangetestDisabledBlocksChange
loading-blocks-change加载态不触发 onChangetestLoadingBlocksChange
checked-uses-primary-token开启消费主色令牌、不消费描边令牌testCheckedUsesPrimaryToken
unchecked-uses-border-token关闭消费描边令牌testUncheckedUsesBorderToken

另有专项:testSizeUsesSwitchTokens / testThumbDiameterIsHeightMinusTwoGaps / testDarkColorsComeFromDarkTokens / testDimensionsAreIdenticalInDarkMode / testSwitchViewInitAcceptsConstant。

bash
swift test --filter LhSwitchTests    # macOS 宿主即可跑,无需模拟器