在不丢失 Html 样式的情况下更改 NSAttributedString 中的字体大小 - Swift

Posted

技术标签:

【中文标题】在不丢失 Html 样式的情况下更改 NSAttributedString 中的字体大小 - Swift【英文标题】:Changing font size in NSAttributedString without losing Html style - Swift 【发布时间】:2015-08-05 15:59:49 【问题描述】:

我在 uiTextView 中添加了一个 html 格式的字符串。一切正常,直到我尝试增加或减少字体大小。当我按下增加或减少按钮时,整个 html 样式和字体都会丢失。 如何在不丢失html样式和字体的情况下增加或减少字体?

import UIKit

extension UILabel 
 func increaseFontSize (txt: String) 
    //        self.font.fontWithSize(self.font.pointSize+1)
    self.font =  UIFont(name: self.font.fontName, size:        self.font.pointSize+1)!
    //self.font.fontWithSize(self.font.pointSize-1)

    var attrStr = NSAttributedString(
        data: txt.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: true)!,
        options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
        documentAttributes: nil,
        error: nil)

    self.attributedText = attrStr

    self.sizeToFit()

func decreaseFontSize (txt: String) 
    //        self.selectable = true
    self.font =  UIFont(name: self.font.fontName, size: self.font.pointSize-1)!
    //self.font.fontWithSize(self.font.pointSize-1)

    var attrStr = NSAttributedString(
        data: txt.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: true)!,
        options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
        documentAttributes: nil,
        error: nil)
    self.attributedText = attrStr

    self.sizeToFit()
    //        self.selectable = false
   


类 ViewController2: UIViewController

   @IBOutlet weak var label: UILabel!


@IBAction func decr(sender: AnyObject) 
    label.decreaseFontSize(text)



@IBAction func inc(sender: AnyObject) 
    label.increaseFontSize(text)


// Do any additional setup after loading the view, typically from a nib.
var text:String = String("<h1 style=\"text-align:center\"> UNIQUE INTERNATIONAL </h1> Unique International turizm şirketimiz, kongre turizmi ve otel işletmeciliği alanında lider konuma sahiptir. Unique turizm şirketimiz 2010 yılında Yükselir Şirketler Grubu çatısı altında faaliyetlerine başlamıştır. Şirketimiz, Uluslararası Kongre Turizmi, Toplantı Organizasyonları, Lansman, Konser, Tanıtım ve Yatçılık gibi konularda müşterimize ve iş ortaklarımıza, Körfez Ülkeleri ve Arap Emirlikleri başta olmak üzere hizmetlerine devam etmektedir. Her türlü organizasyona göre proje geliştirme, uluslararası sanatçı ve iletişim alanlarında koordinasyonu alışılagelmişin dışında creative çözümlerle en kaliteli hizmeti profesyonelce sağlamak ilkesini benimsemiştir. Aldığı takdir ve ödülleriyle daha da güçlenerek sektöre ivme kazandırmaya devam etmektedir. <br /><br /> Unique, uluslararası ‘Sürdürülebilir Turizm Kalkınması’ kurallarına göre turizmde yer alan ev sahipliği ve turist kesimlerinin ihtiyaçlarını ve bugün var olan kaynaklarının gelecekte değerlerinin artırılarak ve korunarak karşılanmasını ilke edinmiştir. (WTO-Dünya Turizm Birliği, 1998) Daha genel bir tanımla, sürdürülebilir turizm, insanın etkileşimde bulunduğu yada bulunmadığı çevrenin bozulmadan veya değiştirilmeden korunarak, kültürel bütünlüğün, ekolojik süreçlerin, biyolojik çeşitliliğin ve yaşamı sürdüren sistemlerin sürdürüldüğü ve aynı zamanda tüm kaynakların ziyaret edilen bölgedeki insanların ve turistlerin ekonomik, sosyal ve estetik ihtiyaçlarını doyuracak şekilde ve gelecek nesillerin de aynı ihtiyaçlarını karşılayabilecekleri biçimde yönetildiği bir kalkınma şeklidir; Unique Uluslararası Turizm şirketimiz, organizasyonlar düzenlediği her ülke, şehir, tarihi bölgeler ve ülkelerin kalsınmasında yatırımları ve kaynaklarıyla önemli ölçüde kalkınmaya destek olmaya ve faaliyetlerine yeni yatırımlarına devam etmektedir. </br></br></br></br> ")

override func viewDidLoad() 
    super.viewDidLoad()



    var attrStr = NSAttributedString(
        data: text.dataUsingEncoding(NSUnicodeStringEncoding, allowLossyConversion: true)!,
        options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
        documentAttributes: nil,
        error: nil)
    label.attributedText = attrStr


override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
   

【问题讨论】:

这是可行的。但是,现有属性可能已经有多种不同大小的字体(如您的示例中所示)。当点击“T+”或“T-”时,预期的行为是什么?例如,一个子字符串的字体大小为 17.0,另一个子字符串的字体大小为 24.0,那么新的大小分别是多少? @Joe Smith 当我点击 T+ 时,它应该获得当前大小并增加 1 。 T- 获取字体大小 -1 。 html属性也丢失了。以 h1 为例,首先它的粗体,然后按下它变成普通文本的东西。 【参考方案1】:

我不知道为什么代码中的函数 increaseFontSize 和 reductionFontSize 需要参数 txt。换句话说,我不认为我完全理解你想要达到的目标。

这里有一些代码供您参考。它是从我为 UITextView 的扩展创建的函数修改而来的。我认为它也应该适用于 UILabel。我自己没有测试过这个。主要思想是在保留其他属性的同时更改字体大小。

func increaseFontSizeBy(pointSize: CGFloat) 
    let fullRange = NSRange(location: 0, length: count(text))
    var mutableAttributeText = NSMutableAttributedString(attributedString: attributedText)
    mutableAttributeText.enumerateAttribute(NSFontAttributeName, inRange: fullRange, options: NSAttributedStringEnumerationOptions.LongestEffectiveRangeNotRequired) 
        (attribute: AnyObject!, range: NSRange, stop: UnsafeMutablePointer<ObjCBool>) -> Void in
        if let attributeFont = attribute as? UIFont 
            let newPointSize = attributeFont.pointSize + pointSize
            let scaledFont = UIFont(descriptor: attributeFont.fontDescriptor(), size: newPointSize)
            mutableAttributeText.addAttribute(NSFontAttributeName, value: scaledFont, range: range)
        
    
    attributedText = mutableAttributeText

【讨论】:

以上是关于在不丢失 Html 样式的情况下更改 NSAttributedString 中的字体大小 - Swift的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Typescript 在不丢失任何道具的情况下键入样式组件?

在不改变背景样式的情况下更改 jumbotron 中的文本

如何在不丢失格式的情况下更改 Word.Range 文本

在不更改应用样式的情况下更改 QSpinBox 箭头大小

如何在不丢失或复制任何记录的情况下移动或更改管道

PyQt 在不重置样式的情况下更改 QPushButton 背景颜色