首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在iOS 14上,adjustsFontSizeToFitWidth无法与NSMutableAttributedString一起正常工作

在iOS 14上,adjustsFontSizeToFitWidth属性与NSMutableAttributedString一起使用时可能会出现问题。adjustsFontSizeToFitWidth是UILabel的一个属性,用于自动调整文本字体大小以适应标签的宽度。NSMutableAttributedString是一个可变的富文本字符串,可以对字符串的不同部分应用不同的样式。

当将NSMutableAttributedString应用于UILabel时,adjustsFontSizeToFitWidth属性可能无法正常工作。这是因为NSMutableAttributedString包含了多个不同样式的文本部分,而adjustsFontSizeToFitWidth只能应用于整个标签的文本。

解决这个问题的方法是手动计算NSMutableAttributedString的大小,并根据需要调整字体大小。可以使用boundingRectWithSize方法来计算NSMutableAttributedString的大小,然后根据计算结果来调整字体大小。

以下是一个示例代码,演示了如何在NSMutableAttributedString上手动调整字体大小:

代码语言:txt
复制
let attributedString = NSMutableAttributedString(string: "Hello World")
attributedString.addAttribute(.font, value: UIFont.systemFont(ofSize: 20), range: NSRange(location: 0, length: 5))
attributedString.addAttribute(.font, value: UIFont.systemFont(ofSize: 30), range: NSRange(location: 6, length: 5))

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 50))
label.attributedText = attributedString

let maxSize = CGSize(width: label.bounds.width, height: CGFloat.greatestFiniteMagnitude)
let boundingRect = attributedString.boundingRect(with: maxSize, options: [.usesLineFragmentOrigin, .usesFontLeading], context: nil)

if boundingRect.size.width > label.bounds.width {
    let scaleFactor = label.bounds.width / boundingRect.size.width
    let scaledFont = UIFont.systemFont(ofSize: 30 * scaleFactor)
    attributedString.enumerateAttribute(.font, in: NSRange(location: 0, length: attributedString.length), options: []) { (value, range, _) in
        if let currentFont = value as? UIFont {
            let scaledDescriptor = currentFont.fontDescriptor.withSize(currentFont.pointSize * scaleFactor)
            let scaledFont = UIFont(descriptor: scaledDescriptor, size: scaledDescriptor.pointSize)
            attributedString.addAttribute(.font, value: scaledFont, range: range)
        }
    }
}

label.attributedText = attributedString

在这个示例中,我们创建了一个NSMutableAttributedString,其中包含了两个不同样式的文本部分。然后,我们创建了一个UILabel,并将NSMutableAttributedString应用于标签的attributedText属性。接下来,我们使用boundingRectWithSize方法计算NSMutableAttributedString的大小,并根据需要调整字体大小。最后,我们将调整后的NSMutableAttributedString再次应用于标签的attributedText属性。

需要注意的是,这只是一个解决方案的示例,实际应用中可能需要根据具体需求进行调整。另外,腾讯云提供了丰富的移动开发相关产品和服务,例如移动推送、移动分析、移动测试等,可以帮助开发者更好地构建和管理移动应用。具体产品和服务的介绍可以参考腾讯云移动开发相关文档和官方网站。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • IOS 图文新闻文章样式

    //在实现图文混排的功能之前,首先往项目中添加一个继承自UIView 父类的子类CTImageView.swift。使用该类的draw方法,并在该方法中使 用Core Text框架渲染富文本, 1 let picWidth = CGFloat(200.0) 2 let picHeight = CGFloat(133.0) 3 UIColor.brown.setFill() 4 UIRectFill(rect) 5 var ctRunCallback = CTRunDelegateCallbacks(version: kCTRunDelegateVersion1, dealloc: { (refCon) -> Void in 6 }, getAscent:{ ( refCon) -> CGFloat in 7 return picHeight 8 }, getDescent:{ (refCon) -> CGFloat in 9 return 0 10 }) { (refCon) -> CGFloat in 11 return picWidth 12 } 13 var picture = “coffee “ 14 let ctRunDelegate = CTRunDelegateCreate(&ctRunCallback, &picture) 15 let placeHolder = NSMutableAttributedString(string:” “) 16 placeHolder.addAttribute(kCTRunDelegateAttributeName as String, value:ctRunDelegate!, range: NSMakeRange(0, 1)) 17 placeHolder.addAttribute(“pictureName”, value: picture, range:NSMakeRange(0, 1)) 18 let article = “咖啡(coffee)是采用经过烘焙的咖啡豆所 制作出来\n\n的饮料,通常为热饮,但也有 作为冷饮的冰咖啡。 咖啡是人类社会流行范围最为广泛的饮料之一,也是重要经济作 物。在繁忙的工作生活 之余,我们可以去尝试做自己的咖啡。” 19 let attributedStr = NSMutableAttributedString(string: article) 20 attributedStr.insert(placeHolder, at:27) 21 attributedStr.addAttribute(kCTUnderlineStyleAttributeName as String, value:NSNumber(value:1), range: NSRange(location:0, length:attributedStr.length)) 22 let framesetter = CTFramesetterCreateWithAttributedString(attributedStr) 23 let path = UIBezierPath(rect:rect) 24 let ctFrame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, attributedStr.length), path.cgPath, nil) 25 26 let crtContext = UIGraphicsGetCurrentContext() 27 crtContext!.textMatrix = CGAffineTransform.identity 28 crtContext?.scaleBy(x:1.0, y:-1.0) 29 crtContext?.translateBy(x:0, y: self.bounds.size.height * -1) 30 CTFrameDraw(ctFrame, crtContext!) 31 let ctLines = CTFrameGetLines(ctFrame) as NSArray 32 var originsOfLines = CGPoint 33 for _ in 0..<ctLines.count{ 34 originsOfLines.append(CGPoint.zero) 35 } 36 let range:CFRange = CFRangeMake(0, 0) 37 CTFrameGetLineOrigins(ctFrame, range, &originsOfLines) 38 for i in 0..<ctLines.co

    02
    领券