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

在这里插入图片描述

需求分析

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

AI实现过程

提问:

在这里插入图片描述

回答:
在这里插入图片描述

import UIKit
import SnapKitclass DynamicLabelsContainerView: UIView {private let horizontalSpacing: CGFloat = 8.0private 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? = nilvar isFirstLabelInLine = truefor string in strings {let label = UILabel()label.text = stringlabel.backgroundColor = .lightGray // 仅为了可视化,实际使用时可移除label.numberOfLines = 1self.addSubview(label)label.snp.makeConstraints { make inif 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 inmake.width.equalTo(label.intrinsicContentSize.width).priority(.high)}// 强制立即布局以获取label的frameself.layoutIfNeeded()// 检查是否需要换行if label.frame.maxX > self.bounds.width {isFirstLabelInLine = truelabel.snp.remakeConstraints { make inmake.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 inmake.bottom.equalTo(lastLabel?.snp.bottom ?? self.snp.top).offset(verticalSpacing)}}
}

验证

在这里插入图片描述

问题:

  • 超出范围没有换行展示

解决:
将下面这句代码注释
在这里插入图片描述

验证:

在这里插入图片描述
问题:

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

解决问题后的最终代码:

import UIKit
import SnapKitclass DynamicLabelsView: UIView {private let horizontalSpacing: CGFloat = 8.0private 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? = nilfor string in strings {let label = UILabel()label.text = stringlabel.backgroundColor = .lightGray // 仅为了可视化,实际使用时可移除label.numberOfLines = 1self.addSubview(label)label.snp.makeConstraints { make inif 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 inmake.width.equalTo(label.intrinsicContentSize.width).priority(.high)}// 强制立即布局以获取label的frameself.layoutIfNeeded()// 检查是否需要换行if label.frame.maxX > self.bounds.width {label.snp.remakeConstraints { make inmake.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 inmake.bottom.equalTo(lastLabel?.snp.bottom ?? self.snp.top).offset(verticalSpacing)}}
}

效果:

在这里插入图片描述

总结

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


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/34621.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

命令行中关于windows hash md5 , mac hash md5 , linux hash md5 文件校验方式

md5, sha-1 ,sha256. windows certutil -hashfile filename md5certutil -hashfile filename sha1certutil -hashfile filename sha256macos 平台 md5 filenameshasum -a 1 filenameshasum -a 256 filenamelinux 平台 md5sum filenameshasum -a 1 fil…

Docker Compose:多容器应用的管理利器

在现代应用开发中,微服务架构已成为主流。管理和编排多个容器应用变得至关重要。Docker Compose 是一个强大的工具,通过一个简单的 YAML 文件定义和运行多容器应用。本文将详细介绍 Docker Compose 的基本概念、安装、用法以及一个实际的示例&#xff0c…

CEWEY C9自动猫砂盆测评:千元级安全实用稳定输出,解放铲屎官双手!

最近邻居姐姐成为新晋铲屎官,猫咪的吃喝还好,因为是打工人每天要早出晚归,铲屎这项不能等待的任务就让她很苦恼,猫砂盆太脏猫咪要么憋着不上要么乱拉乱尿,搞得小姐姐身心俱疲。看着她日渐憔悴的脸色,我这个…

Linux 动态监控系统

top与ps命令很相似。它们都用来显示正在执行的进程。Top与ps最大的不同之处,在于top在执行一段时间可以更新正在运行的的进程。 一、基本指令 top top -d: 秒数 :每隔设定值秒数更新,未设置下默认为3秒 top -i:使top不显示任何闲置或者僵死进…

C++ 20新特性之语法糖

💡 如果想阅读最新的文章,或者有技术问题需要交流和沟通,可搜索并关注微信公众号“希望睿智”。 概述 C 20中引入了一些简化编程工作的语法上的新特性,我们暂且美其名曰:“语法糖”。下面,我们将对这些“语…

chkstk.asm未经处理的异常

【1】异常图片 【2】异常原因 运行程序时,程序尝试分配的内存超出了当前线程的堆栈边界 【3】定位:如下图,数组分配过大

什么悬挂指针,如何避免(C/C++)

悬挂指针(Dangling Pointer) 悬挂指针是指向已经被释放或者不再存在的内存区域的指针。当程序尝试使用这样的指针访问或修改已释放的内存时,会导致未定义行为,通常是程序崩溃或数据损坏。 示例代码(C) #…

定时触发-uniapp + uniCloud 订阅消息实战教程(三)

上一节已经对云函数有了一定的了解,但是,为了发送订阅消息,只会云函数还是差了那么一点意思,所以接下来的这一节,将带领大家熟悉一下定时触发。 熟悉定时触发 如果云函数需要定时/定期执行,即定时触发&…

【力扣C++】爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n 2 输出:2 解释:有两种方法可以爬到楼顶。 1. 1 阶 1 阶 2. 2 阶 示例 2&#x…

昇思25天学习打卡营第1天|初学教程

文章目录 背景创建环境熟悉环境打卡记录学习总结展望未来 背景 参加了昇思的25天学习记录,这里给自己记录一下所学内容笔记。 创建环境 首先在平台注册账号,然后登录,按下图操作,创建环境即可 创建好环境后进入即可&#xff0…

文华财经wh7均线ema金叉死叉预警指标公式源码

文华财经wh7均线ema金叉死叉预警指标公式源码: 文华财经均线EMA预警指标公式源码: EMA25:EMA(C,25); EMA70:EMA(C,70); EMA580:EMA(C,580); //在EMA580上方EMA25和EMA70金叉EMA70在EMA580上方创1日新高创前5根K线最高 EMA25>EMA580&&EM…

Rosetta Stone + Lexia English:各自特点和差异化互补运用

Rosetta Stone 和 Lexia English 是两款不同的语言听说训练软件,虽然它们都专注于听说训练,但是它们各自有着独特的特点和教学方法。以下是它们的一些区别和互补之处: Rosetta Stone 教学方法:Rosetta Stone 使用一种称为“动态…

PHP原生代码生成pdf---解决中文乱码问题

github地址 尝试了使用composer下载FPDF或者FPDI,但是无法解决中文乱码问题。只有使用这个github上的中文包才可以,那俩没必要下。 直接上代码(这里并没有使用任何框架) require(./fpdf/chinese.php);//生成pdf$pdf new PDF_Chinese();$pdf->AddPage…

Jenkins教程-8-上下游关联自动化测试任务构建

上一小节小节我们学习了一下Jenkins自动化测试任务发送测试结果邮件的方法,本小节我们讲解一下Jenkins上下游关联自动化测试任务的构建。 下面我们以一个真实的自动化测试场景来讲解Jenkins如何管理上下游关联任务的触发和构建,比如我们有两个jenkin任务…

【贪心】个人练习-Leetcode-1647. Minimum Deletions to Make Character Frequencies Unique

题目链接:https://leetcode.cn/problems/minimum-deletions-to-make-character-frequencies-unique/description/ 题目大意:给出一个字符串s,只包含小写字母。目标是【通过删除若干个字符】将其变为「每个字符出现的频次都不同」的字符串&am…

病毒防护:恶意代码检测技术,病毒分类、传播方式,恶意代码的清除与防护

「作者简介」:冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础著作 《网络安全自学教程》,适合基础薄弱的同学系统化的学习网络安全,用最短的时间掌握最核心的技术。 这一章节我们需…

惠海 HC070N06LS 6N06 沟槽型NMOS管 皮实耐抗 丝印HC606A 抗雪崩能力强

产品详情 HC070N06LS 60V/6A MOS管 低Vth 惠海半导体原厂 抖频过认证EMC&EMI:0 产品详情 型号HC070N06LS品牌惠海半导体 封装SOT23-3输入电压60V 驱动方式内置MOS耐压150V。 Features : N-Channel Enhancement mode Very low on-resistance VGS4.5V Fast S…

力扣每日一题 下一个更大元素 II 单调栈 循环数组

Problem: 503. 下一个更大元素 II 思路 &#x1f468;‍&#x1f3eb; 参考题解 Code class Solution {public int[] nextGreaterElements(int[] nums) {int n nums.length;int[] res new int[n];Arrays.fill(res,-1);Stack<Integer> stack new Stack<>();//…

docker-compose部署Flink及Dinky

docker-compose部署Flink及Dinky 服务器环境&#xff1a;centos7 1. 配置hosts vim /etc/hostsx.x.x.x jobmanager x.x.x.x taskmanager x.x.x.x dinky-mysql2. 文件目录结构 . ├── conf │ ├── JobManager │ │ ├── flink-conf.yaml │ │ ├── log…

深入理解 Redis 内存碎片及其清理方法

在线工具站 推荐一个程序员在线工具站&#xff1a;程序员常用工具&#xff08;http://cxytools.com&#xff09;&#xff0c;有时间戳、JSON格式化、文本对比、HASH生成、UUID生成等常用工具&#xff0c;效率加倍嘎嘎好用。 程序员资料站 推荐一个程序员编程资料站&#xff1a;…