SwiftUI 自定义 segmented control

本文介绍了如何使用SwiftUI创建一个自定义的segmented control,其设计灵感来源于Android,具有动态伸缩的下划线效果。通过一步步的代码实现,展示了如何从SwiftUI的基础组件构建到自定义布局,包括使用Stack搭建结构,创建辅助函数获取子视图尺寸,以及计算选中项的偏移量。文章还解决了item之间的间距问题,并提供了完整的代码示例和Demo仓库链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

无聊的开始:

需要创建一个segmented control,效果如下:

是不是看着很眼熟,没错,很像Android上的对不对?!黑色下划线会移动到所选择的title下面,而且能根据文字的长度自动伸缩。

为啥这么像android的?因为耗了一个下午弄出来后发现,我打开的Figma设计页面是Android的。。。

所以好吧,如果你也尿手上了, 不是, 如果你也需要类似的设计,希望这篇文章能帮到你。

蕾丝正文:

不要问我正文为啥是蕾丝的,难道你不喜欢?!

首先,SwiftUI 自带的 Picker 可以创建如下的 Segmented control

嗯, 估计没有哪个设计师会同意用这个,所以,自定义layout就在所难免了。但是 SegmentedPickerStyle 能更改的东西太少了。所以咱就自己建吧。

第一步: 创建一个demo project 选择 SwiftUI App 为了演示方便,如果你习惯AppDelegate,都一样。

 创建完成后,得到一个显示“Hello, world!”的空项目, 经验值+1 。。。

第二步:创建一个新的 SwiftUI class,起名叫小娟 或 SegmentedControl 随你。替换成如下代码

import SwiftUI

struct SegmentedControl: View {

    @Binding private var selection: Int
    @State private var segmentSize: CGSize = .zero

    private let items: [String]

    private let xSpace: CGFloat = 4

    public init(items: [String],
                selection: Binding<Int>) {
        self._selection = selection
        self.items = items
    }

    var body: some View {
        // 1
        VStack(alignment: .center, spacing: 0) {
            // 2
            VStack(alignment: .leading, spacing: 0) {
                // 3
                HStack(spacing: xSpace) {
                    ForEach(0 ..< items.count, id: \.self) { index in
                        segmentItemView(for: index)
                    }
                }
                .padding(.bottom, 12)
            }
            .padding(.hor
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值