曲折的“修改 attributeText 的文字”尝试

   日期:2024-12-20    作者:ywhgrl 移动:http://oml01z.riyuangf.com/mobile/quote/7966.html

因为设计稿中,文字是带有行高、间距、baselineOffset 等信息,所以需要使用 来实现。举例;


上述代码,很常见,很长时间大家都是这么用,或再一步封装。随着开发和视觉同学确认视觉规范后,事情变的不简单起来了。

  1. 经过视觉同学梳理,上述的所有样式被归纳为一个 code,即 ,即设置上述 文字时,简化为一行代码;

  1. 开发同学,对上述代码不够满意——因为设置样式和文字内容不一定是一起进行。比较普遍的情况是,在 的时候设置样式,在数据返回后设置文字内容,期望的调用方式:

上面代码调用对开发很自然、友好,但是实现起来有个难点:
生成 时是需要有文字内容的,如果 为空,这设置 attributes 的属性会丢失。即


这样设置是无效的,后续设置 会显示默认 17px 黑色 regular 的样式。如果在设置 之前就有文案,即;


经过测试,后续修改文案可以生效,但这对调用方提出了要求,有两种方式:

  1. 先设置文案,再设置样式 (缺点:开发容易忘记、犯错)
  2. 调用样式的时候同时设置文案(缺点:在更新文案时,很不友好——loadSubview 的时候设置样式,后续修改文案还需要设置样式)

理想的情况是顺序无关,即


这样就没有调用顺序的问题,而且后续修改文字,也用最自然的方式,非常棒。
如何实现呢?


最重要的逻辑:如果设置样式时,没有文字内容,则以 ” “ 空字符串来创建 , 这样初次渲染时,样式内容都创建了,在界面短暂显示空字符串,对用户无干扰。当需要设置后端返回的数据时,调用接口。

样式接口提交后,大家在模拟器开发没什么问题,等我跑 iPhone 6 的适配代码时,我发现 iOS 12 设置的字体显示不对,一个”Pro 会员“ 的商品文字标签,超出了背景色,典型的默认样式—— 上述用 @" " 来占位的方式失效了。解决方案,把 hook 住;





但是如果第二次修改文字时,同时设置样式:


则不会出现此问题。经过两种方式输出对应的 attributedString 的对象,发现属性全部都一样,只是在渲染时有所不同。

  1. 使用空字符 ” “ 首先设置 styleCode 来设置的样式属性
  2. hook 掉 在更新的时候,自动获取旧的 attributes 属性,更新文案。
  3. 如果遇到复杂的 (如划线价+促销价格),还是使用来更新文字内容(如果用 setText 来更新赋值样式,则会用 attributes 里前一组来渲染文案。

欢迎大家勘误。

  1. Changing an Attributed String
  2. 严选的字号 -> 行高、边距的配置

特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。


举报收藏 0评论 0
0相关评论
相关最新动态
推荐最新动态
点击排行
{
网站首页  |  关于我们  |  联系方式  |  使用协议  |  隐私政策  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号