Swift 属性标题语法

Posted

技术标签:

【中文标题】Swift 属性标题语法【英文标题】:Swift Attributed Title Syntax 【发布时间】:2016-09-20 04:44:08 【问题描述】:

我正在尝试做这样的事情:

let introText = "This is sample "
let facebookText = "Text"
loginButton.setTitle("\(introText)\(facebookText)", forState: .Normal)
loginButton.addAttribute(NSFontAttributeName, value: UIFont(name: "Arial", size: 15.5)!, range: NSMakeRange(0, introText.characters.count))
loginButton.addAttribute(NSFontAttributeName, value: UIFont(name: "Arial-Bold", size: 15.5)!, range: NSMakeRange(introText.characters.count, facebookText.characters.count))
loginButton.addAttribute(NSForegroundColorAttributeName, value: UIColor.whiteColor(), range: NSMakeRange(0, introText.characters.count + facebookText.characters.count))

以这种形式:

loginButton.setAttributedTitle(NSMutableAttributedString(
    string: "\(introText)\(facebookText)",
    attributes: [
        // attributes go here
        NSForegroundColorAttributeName: UIColor.colorFromCode(0x151515),
    ]), forState: UIControlState.Normal)

我可以这样做吗?我无法弄清楚如何在包含的属性中包含范围。

编辑

对不起,如果不是很明显,但我的代码所做的是它创建了一个属性字符串,显示为“这是示例 文本”,其中单词 Text 加粗,如图所示。如果可能的话,我正在尝试将这段代码重写为我展示的第二种语法的形式。

谢谢!

【问题讨论】:

你想用属性文本做什么? “难以弄清楚如何在包含的属性上包含范围”是什么意思?有什么问题? 我无法在第二种形式中包含范围。我一直在玩弄语法,但似乎无法包含它。我搜索了文档,但在第二种形式中我看不到任何包含范围等属性的东西,所以我不确定你是否可以这样做@NazmulHasan 你想在你的按钮中设置范围吗? 我想要的输出是 This is sample TextThis is sample 是非粗体,Text 是粗体 @UmairAfzal 【参考方案1】:

如果您正在寻找带有粗体部分的属性文本,这将为您解决。

extension String 

  func getPartOfStringBold(boldPart:String)-> NSAttributedString
    return getPartOfStringBold(boldPart, font: UIFont(name: "Taz-Bold", size: 13)!)
 

//Make your string bold
  func getPartOfStringBold(boldPart:String, font:UIFont)-> NSAttributedString
    let attributtedString = NSMutableAttributedString(string: self)
    let attrs = [NSFontAttributeName:font]
    let rangePart: NSRange = (attributtedString.string as NSString).rangeOfString(boldPart)
    attributtedString.addAttributes(attrs, range: rangePart)
    return attributtedString
  

//Make your string Italic
  func getPartOfStringItalic(italicPart:String)-> NSAttributedString
    let attributtedString = NSMutableAttributedString(string: self)

    if let font = UIFont(name: "Taz-LightItalic", size: 13)
    
        let attrs = [NSFontAttributeName:font, NSForegroundColorAttributeName:UIColor.blackColor()]
        let rangePart: NSRange = (attributtedString.string as NSString).rangeOfString(italicPart)
        attributtedString.addAttributes(attrs, range: rangePart)
    
    return attributtedString
  

【讨论】:

【参考方案2】:

据我了解您的问题,如果是,您希望将一部分测试设为粗体,那么这是我为此目的使用的扩展

import UIKit
import Foundation

extension String


static func makeTextBold(preBoldText:String, boldText:String, postBoldText:String, fontSzie:CGFloat) -> NSAttributedString 

    let boldAttrs = [NSFontAttributeName : UIFont(name: "HelveticaNeue-Bold", size: fontSzie) as? AnyObject]
    let attributedString = NSMutableAttributedString(string:boldText, attributes:boldAttrs as? [String:AnyObject])

    let lightAttr = [NSFontAttributeName : UIFont(name: "HelveticaNeue-Light", size: fontSzie) as? AnyObject]
    let finalAttributedText = NSMutableAttributedString(string:preBoldText, attributes:lightAttr as? [String:AnyObject])

    let postText = NSMutableAttributedString(string:postBoldText, attributes:lightAttr as? [String:AnyObject])

    finalAttributedText.appendAttributedString(attributedString)
    finalAttributedText.appendAttributedString(postText)
    // print(finalAttributedText)
    return finalAttributedText


所以基本上这个函数所做的就是你传递三个文本参数和一个字体大小参数,它会返回一个属性字符串。

这是您的案例的示例用法

myLabel.attributedText = String.makeTextBold("This is sample", boldText: "Text", postBoldText: "", fontSzie: 21)

输出将是

这是示例文本

我希望这能回答问题:-)

【讨论】:

这是我在 Umair 之前回答的问题。你没看到我的回答吗?回答前请先看看答案 @GaneshKumar 我已经发布了我用过并发现有用的东西。他/她选择哪个答案是OP的选择。干杯:-) 我同意这一点。但答案应该有不同的方法吧? 是的。你正在使用 NSRange 而我没有。 NSRange 在这里很重要吗?

以上是关于Swift 属性标题语法的主要内容,如果未能解决你的问题,请参考以下文章

Swift 4 快捷语法将多个对象(设置了一些属性)添加到数组中?

Swift 中的可选闭包属性

如何在 Swift 中更改结构属性

iOS Swift 2.3:应用程序恢复处理程序的正确语法?

在 Swift 中子类化 PFObject

“计算属性必须具有显式类型”错误:如何在 Swift 2.x 中列出文件? [复制]