iOS基础之NSAttributeString封装

lionel-messi.jpeg

笔者在开发app过程中,有很多页面都需要富文本显示,因为写的重复代码太多,并且富文本的api和参数相对较多,不利于记忆,所以有必要将富文本的业务逻辑封装起来,方便以后开发过程中的调用。另外,这种造轮子方式都是逐步完善的,出现新的需求或问题,需要开发者不断地更新轮子。在此,笔者只是提供一个简单的思路,希望能给读者朋友一些小小的帮助。

封装字体的模型FRTextModel

FRTextModel模型封装了富文本相关的属性,例如文字、字体大小、字体颜色、行间距等,如下代码所示,

import UIKit
struct FRTextFontModel {
    var text = ""
    var fontSize: CGFloat = 0
    var fontColor = UIColor.white
    var lineSpacing: CGFloat = 0
}

构建富文本的核心类FRAttributesHelper

FRAttributesHelper将多个FRTextModel的内容拼接起来,并返回一个新的富文本字符串,如下代码所示,

import UIKit
class FRAttributesHelper: NSObject {
    class func createAttributeText(models: [FRTextFontModel]) -> NSAttributedString {
        var fullText: String = ""
        for model in models {
            fullText += model.text
        }
        let attributedString = NSMutableAttributedString(string: fullText)
        var index: Int = 0
        for model in models {
            var attributes = [NSFontAttributeName: UIFont.systemFont(ofSize: model.fontSize),
                              NSForegroundColorAttributeName: model.fontColor]
            if model.lineSpacing != 0 {
                let paragraphStyle = NSMutableParagraphStyle()
                paragraphStyle.lineSpacing = model.lineSpacing
                attributes += [NSParagraphStyleAttributeName: paragraphStyle]
            }
            attributedString.addAttributes(attributes, range: NSRange(location: index, length: model.text.length))
            index += model.text.length
        }
        return attributedString
    }
}

简单的使用

使用非常简单,只需要构建FRTextModel内容,并以数组的形式传递给FRAttributesHelper的createAttributeText类方法即可,如下代码所示,

// 设置数字的字体和颜色
let answerCount = FRTextFontModel(text: "\(model.answerCount)", fontSize: 18, fontColor: UIColor(hex: 0x333333), lineSpacing: 0)
let answerDesc = FRTextFontModel(text: " 个问题", fontSize: 11, fontColor: UIColor(hex: 0x666666), lineSpacing: 0)
self.questionCountLabel.attributedText = FRAttributesHelper.createAttributeText(models: [answerCount, answerDesc])
            
let postCount = FRTextFontModel(text: "\(model.postCount)", fontSize: 18, fontColor: UIColor(hex: 0x333333), lineSpacing: 0)
let postDesc = FRTextFontModel(text: " 个帖子", fontSize: 11, fontColor: UIColor(hex: 0x666666), lineSpacing: 0)
self.postCountLabel.attributedText = FRAttributesHelper.createAttributeText(models: [postCount, postDesc])
            
let bestAnswerCount = FRTextFontModel(text: "\(model.bestAnswerCount)", fontSize: 18, fontColor: UIColor(hex: 0x333333), lineSpacing: 0)
let bestAnswerDesc = FRTextFontModel(text: " 个最佳回答", fontSize: 11, fontColor: UIColor(hex: 0x666666), lineSpacing: 0)
self.bestAnswerCountLabel.attributedText = FRAttributesHelper.createAttributeText(models: [bestAnswerCount, bestAnswerDesc])

运行效果如下图所示,

attributes-text.jpeg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,844评论 25 709
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,779评论 4 61
  • 感恩日记 7月4日 今天早晨梳头时,发现自己的留海长了,早饭后处理以下手头工作去了经常光顾当地的贝美理发...
    雪域红梅阅读 1,427评论 0 0
  • 中医常说“正气存内,邪不可干,邪之所凑,其气必虚。”意思是说,人体内的正气足,人的抗病能力就强,就不容易生病。正气...
    铺灸阅读 1,648评论 0 0
  • 和上道题思路一样可以通过盲注也可以明注 明注验证Payload : 盲注验证Payload :
    王一航阅读 2,890评论 0 0

友情链接更多精彩内容