AI 编程探索- iOS动态标签控件

需求分析

  1. 标签根据文字长度,自适应
  2. 标签居中显示
  3. 扩展 超过内容显示范围,需要换行显示,且保持居中显示

AI实现过程

提问:

回答:

c 复制代码
import UIKit
import SnapKit

class DynamicLabelsContainerView: UIView {
    private let horizontalSpacing: CGFloat = 8.0
    private let verticalSpacing: CGFloat = 4.0
    
    // 初始化方法
    override init(frame: CGRect) {
        super.init(frame: frame)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    // 配置容器视图
    func configure(with strings: [String]) {
        // 先清除所有子视图
        self.subviews.forEach { $0.removeFromSuperview() }
        
        var lastLabel: UILabel? = nil
        var isFirstLabelInLine = true
        
        for string in strings {
            let label = UILabel()
            label.text = string
            label.backgroundColor = .lightGray // 仅为了可视化,实际使用时可移除
            label.numberOfLines = 1
            self.addSubview(label)
            
            label.snp.makeConstraints { make in
                if let lastLabel = lastLabel {
                    make.top.equalTo(isFirstLabelInLine ? lastLabel.snp.bottom : lastLabel.snp.top).offset(isFirstLabelInLine ? verticalSpacing : 0)
                    make.left.equalTo(isFirstLabelInLine ? self.snp.left : lastLabel.snp.right).offset(horizontalSpacing)
                } else {
                    make.top.equalTo(self.snp.top).offset(verticalSpacing)
                    make.left.equalTo(self.snp.left).offset(horizontalSpacing)
                }
                
                // 确保标签不会超出容器视图的宽度
                make.right.lessThanOrEqualTo(self.snp.right).offset(-horizontalSpacing)
            }
            
            // 使用布局完成回调来决定是否需要换行
            label.snp.makeConstraints { make in
                make.width.equalTo(label.intrinsicContentSize.width).priority(.high)
            }
            
            // 强制立即布局以获取label的frame
            self.layoutIfNeeded()
            
            // 检查是否需要换行
            if label.frame.maxX > self.bounds.width {
                isFirstLabelInLine = true
                label.snp.remakeConstraints { make in
                    make.top.equalTo(lastLabel?.snp.bottom ?? self.snp.top).offset(verticalSpacing)
                    make.left.equalTo(self.snp.left).offset(horizontalSpacing)
                    make.width.equalTo(label.intrinsicContentSize.width).priority(.high)
                }
            } else {
                isFirstLabelInLine = false
            }
            
            lastLabel = label
        }
        
        // 更新容器视图的高度约束以适应所有标签
        self.snp.makeConstraints { make in
            make.bottom.equalTo(lastLabel?.snp.bottom ?? self.snp.top).offset(verticalSpacing)
        }
    }
}

验证

问题:

  • 超出范围没有换行展示

解决:

将下面这句代码注释

验证:


问题:

  • 第二排第二个label的布局有问题

解决问题后的最终代码:

c 复制代码
import UIKit
import SnapKit

class DynamicLabelsView: UIView {
    private let horizontalSpacing: CGFloat = 8.0
    private let verticalSpacing: CGFloat = 4.0
    
    // 初始化方法
    override init(frame: CGRect) {
        super.init(frame: frame)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    // 配置容器视图
    func configure(with strings: [String]) {
        // 先清除所有子视图
        self.subviews.forEach { $0.removeFromSuperview() }
        
        var lastLabel: UILabel? = nil
      
        for string in strings {
            let label = UILabel()
            label.text = string
            label.backgroundColor = .lightGray // 仅为了可视化,实际使用时可移除
            label.numberOfLines = 1
            self.addSubview(label)
            
            label.snp.makeConstraints { make in
                if let lastLabel = lastLabel {
                    make.top.equalTo(lastLabel.snp.top).offset(0)
                    make.left.equalTo(lastLabel.snp.right).offset(horizontalSpacing)
                } else {
                    make.top.equalTo(self.snp.top).offset(verticalSpacing)
                    make.left.equalTo(self.snp.left).offset(horizontalSpacing)
                }
                
            }
            
            // 使用布局完成回调来决定是否需要换行
            label.snp.makeConstraints { make in
                make.width.equalTo(label.intrinsicContentSize.width).priority(.high)
            }
            
            // 强制立即布局以获取label的frame
            self.layoutIfNeeded()
            
            // 检查是否需要换行
            if label.frame.maxX > self.bounds.width {
                label.snp.remakeConstraints { make in
                    make.top.equalTo(lastLabel?.snp.bottom ?? self.snp.top).offset(verticalSpacing)
                    make.left.equalTo(self.snp.left).offset(horizontalSpacing)
                    make.width.equalTo(label.intrinsicContentSize.width).priority(.high)
                }
            }
            lastLabel = label
        }
        
        // 更新容器视图的高度约束以适应所有标签
        self.snp.makeConstraints { make in
            make.bottom.equalTo(lastLabel?.snp.bottom ?? self.snp.top).offset(verticalSpacing)
        }
    }
}

效果:

总结

到这里我们通过AI快速实现了动态标签控件的核心部分,只需再稍微调整一下label的样式就能完美实现我们的需求。AI帮我们写了大部分的可用的代码,虽然不能完全采用,但是确实提升了我们的开发效率,代码质量也是很不错的,我们要做的就是根据自己的需求进行修改一下。后面继续在实战中探索如何高效使用AI来帮助我们开发和学习。


感谢您的阅读和参与,HH思无邪愿与您一起在技术的道路上不断探索。如果您喜欢这篇文章,不妨留下您宝贵的赞!如果您对文章有任何疑问或建议,欢迎在评论区留言,我会第一时间处理,您的支持是我前行的动力,愿我们都能成为更好的自己!

相关推荐
郑州光合科技余经理2 小时前
本地生活服务系统:成品模块和定制接口怎么划界
java·前端·人工智能·后端·系统架构·php·ai编程
2501_930472442 小时前
踩坑|CodeBuddy权限配置:AI误删文件、乱跑命令、.env泄露怎么防
人工智能·ai编程
杨杨杨大侠5 小时前
从 Token 到蒸馏:一步步理解大模型如何工作
aigc·openai·ai编程
小磊哥er8 小时前
深入解构Claude Code - 第 12 篇 · 整体串起来
javascript·ai编程
小磊哥er8 小时前
深入解构Claude Code - 第 11 篇 · 工程上的讲究
javascript·ai编程
Mintimate9 小时前
Codex 多账号切换不再折腾:OAuth 配对与 Auth 迁移实践
agent·ai编程
2501_9151063211 小时前
安卓抓包软件2026,免证书抓包 应用层抓包 代理抓包全解析
网络协议·计算机网络·网络安全·ios·adb·https·udp
promiseThen12 小时前
我用 7 条铁律管住 Cursor:让 AI 写代码不再「自由发挥」
前端·ai编程
可以想象12 小时前
Agent 层比模型层更重要?从本周 AI 两件大事说起
aigc·ai编程
kango12 小时前
Xcode、模拟器Runtime、真机符号完整知识手册
ios·app