Skip to content

Radio 单选框 ​

受控单选框。@Binding var checked 表示「该项是否选中」,通常配合分组使用;同一组内只能有一项为 true。

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

状态 ​

选中态为描边主色圆环 + 实心主色圆点;未选中为描边空环。圆点直径为尺寸乘 radio.dotScale(50%)。

9:41Radio 状态
未选中已选中
禁用选中禁用未选中

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

swift
@State private var picked = "blue"

LhRadio(checked: Binding(get: { picked == "blue" }, set: { _ in }), value: "blue", label: "青花瓷") { _ in
  picked = "blue"
}

尺寸 ​

三档尺寸映射到 radio.size 令牌;圆环描边取 radio.ringWidth。

9:41Radio 尺寸
小号中号大号

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

点击 gate ​

已选中再点击保持选中且不触发 onChange(黄金用例 tap-checked-keeps-checked); 禁用态不触发(disabled-blocks-change)。分组容器留待后续版本。

API ​

Props ​

属性说明类型默认值
checked该项是否选中(受控双向绑定)Bool—
value该项代表的值(与 checked 配合实现单选组)String""
disabled是否禁用(不触发 onChange)Boolfalse
size单选框尺寸,映射到尺寸令牌LhRadioSize.medium
label文字标签String""
onChange选中变化回调,payload 为新值((Bool) -> Void)?nil

LhRadioSize ​

值环尺寸圆点直径
.smallradio.size.small(16pt)尺寸 × radio.dotScale(8pt)
.mediumradio.size.medium(20pt)尺寸 × radio.dotScale(10pt)
.largeradio.size.large(24pt)尺寸 × radio.dotScale(12pt)

颜色 ​

状态环描边圆点
未选中color.border.base(radio.ringWidth)—
选中color.primary.defaultcolor.primary.default
禁用color.disabled.bordercolor.disabled.text

令牌对照 ​

令牌用途
radio.size.{small,medium,large}三档环尺寸
radio.dotScale圆点相对环尺寸的比例(50%)
radio.ringWidth环描边宽度
radio.gap环与文字间距(跟随 spacing.sm)
color.primary.default选中态描边与圆点色
color.border.base未选中描边色
color.disabled.{border,text}禁用态描边与圆点色
color.text.{primary,disabled}标签文字色

黄金用例对照 ​

case id断言本地测试
tap-unchecked-emits-onchange未选中点击触发 onChange(true)testUncheckedIsInteractive
tap-checked-keeps-checked已选中点击保持选中且不回调testCheckedShowsDot
disabled-blocks-change禁用态不触发 onChangetestDisabledBlocksChange
checked-uses-primary-tokens选中态消费主色令牌testCheckedUsesPrimaryTokens
unchecked-uses-border-token未选中消费描边令牌testUncheckedUsesBorderToken
small-size-uses-small-token小号消费 small 尺寸令牌testSmallSizeUsesSmallToken

另有专项:testStrokeUsesRadioTokens / testDarkColorsComeFromDarkTokens / testDisabledInDarkUsesDarkDisabledTokens / testDimensionsAreIdenticalInDarkMode / testRadioViewInitAcceptsConstant。

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