将文字和图片放在AttributedString

时间:2019-04-06 19:06:47

标签: ios swift nsattributedstring nsmutablestring

我在Swift中有一个属性字符串,该字符串在用户名旁边显示一个图标。效果很好,我的实现如下所示:

attributedUsername = NSMutableAttributedString(string: "username")
let iconAttachment = NSTextAttachment()
let iconImage = UIImage(named: "userIcon")
iconAttachment.image = iconImage
iconAttachment.bounds = CGRect(x: 0, y: -3, width: 14, height: 14)
let iconString = NSAttributedString(attachment: verifiedAttachment)
attributedUsername.append(iconString)

usernameLabel.attributedText = attributedUsername

但是,有时用户名太大而不能放在一行上,而将用户名放在第二行(numberOfLines = 0)上。可以,但是如果用户名足够长以适合屏幕显示,则图像将换行到下一行。我想知道是否有任何方法可以将图标包装在用户名的末尾。我要实现的目标是,其中*是图标,

username *

longer username *

a very long
username *

代替:

username *

longer username *

a very long username
*

所以基本上,我希望图标与用户名的最后一部分(如果可能)粘在一起。如果用户名不包含空格且太长,则应将其包装在下一行,因为这是标准实现。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

好吧,我不确定是否可以通过在Errors in /Users/vsts/agent/2.149.2/work/1/s/TestApp/TestApp.Android/TestApp.Android.csproj NU1101: Unable to find package Xamarin.LiveReload. No packages exist with this id in source(s): nuget.org My Reference for this package point to this site it is not point to nuget package. 中设置一些选项来做到这一点,但是您可以通过简单的算法轻松实现。

首先,将创建属性字符串的代码移至函数,因为我们将使用它来计算宽度。确保还设置了font属性,以便可以从属性字符串中获取正确的大小:

NSAttributedString

然后:

func attributedString(for text: String) -> NSAttributedString {
    let attributedText = NSMutableAttributedString(string: text)
    let iconAttachment = NSTextAttachment()
    let iconImage = UIImage(named: "star")
    iconAttachment.image = iconImage
    iconAttachment.bounds = CGRect(x: 0, y: -3, width: 14, height: 14)
    let iconString = NSAttributedString(attachment: iconAttachment)
    attributedText.append(iconString)
    attributedText.setAttributes([.font: UIFont(name: "Avenir-Book", size: 15)!],
                                 range: NSRange((text.startIndex..<text.endIndex), in: text))
    return attributedText
}

当然,您会希望取消强制展开和其他不太好的做法。不过,这些只是为了简洁。我希望你有主意。