如何使用nsattributedstring在Swift中将图像添加为文本附件 [英] How to add images as text attachment in Swift using nsattributedstring
问题描述
我正在尝试使用我作为按钮放入的图像为iOS构建自定义键盘。当我按下按钮时,链接到按钮的图像被放入一个属性字符串,该字符串被加载到自定义键盘视图内的UiTextView中。那很有效。
I'm trying to build a custom keyboard for iOS using images which I've put in as buttons. When I press a button, the image linked to the button is put into an attributed string which is loaded into an UiTextView inside the custom keyboard view. That is working.
问题在于,当我将新图像附加到属性字符串时,字符串中的旧图像和新图像都会更改为我当前按下的图像。我无法理解为什么字符串中的旧图像会发生变化。
The problem is that when I append a new image to the attributed string both the old and new images in the string are changing to the image I currently pressed on. I can't understand why the old images in the string are changing.
有什么建议吗?我尝试过使用replaceCharactersInRange和insertAttributedString但无法使其工作。这是代码(在viewDidLoad之后):
Any suggestions? I've tried using replaceCharactersInRange and insertAttributedString but can't get it to work. Here is the code (after viewDidLoad):
let textAttachment = NSTextAttachment()
let textView = UITextView(frame: CGRectMake(5, 5, 200, 40))
var attributedString = NSMutableAttributedString(string: "")
@IBAction func buttonPressed(button :UIButton) {
let string = button.titleLabel?.text
textAttachment.image = UIImage(named: "\(string!).png")!
textAttachment.image = UIImage(CGImage: textAttachment.image!.CGImage!, scale: 6, orientation: .Up)
let attrStringWithImage = NSAttributedString(attachment: textAttachment)
attributedString.appendAttributedString(attrStringWithImage);
textView.attributedText = attributedString;
}
谢谢!
推荐答案
我们不能简单地附加NSTextAttachment图像。我们必须存储
所有附加的图像和连接到现有的属性
String。
We cannot simply append NSTextAttachment image .We have to store all the attached Image and concatenation to existing attributed String.
func buttonPressed(_ sender: Any) {
let button = sender as! UIButton
let tag = button.tag
let attributedString:NSAttributedString!
switch tag {
case 2:
attributedString = addAttributedText(text: (button.titleLabel?.text)!)
case 3:
attributedString = addAttributedText(text: (button.titleLabel?.text)!)
case 4:
attributedString = addAttributedText(text: (button.titleLabel?.text)!)
default:
attributedString = addAttributedText(text: "launch")
}
textView.attributedText = attributedString
}
func addAttributedText(text:String) -> NSAttributedString {
textViewDidChange(textView)
let axtractedImageAttribute = NSMutableAttributedString()
for image in imageArray {
let attachment:NSTextAttachment = NSTextAttachment()
attachment.image = image
attachment.setImageHeight(height: 20)
let attachmentString:NSAttributedString = NSAttributedString(attachment: attachment)
axtractedImageAttribute.append(attachmentString)
}
let attachment:NSTextAttachment = NSTextAttachment()
attachment.image = UIImage(named: "\(text).png")
attachment.setImageHeight(height: 20)
let attachmentString:NSAttributedString = NSAttributedString(attachment: attachment)
let attributedString:NSMutableAttributedString = NSMutableAttributedString(string:textView.text!)
attributedString.append(axtractedImageAttribute)
attributedString.append(attachmentString)
return attributedString
}
//MARKS:- Extract attachedImage
func textViewDidChange(_ textView: UITextView) {
imageArray = [UIImage]()
let range = NSRange(location: 0, length: textView.attributedText.length)
if (textView.textStorage.containsAttachments(in: range)) {
let attrString = textView.attributedText
var location = 0
while location < range.length {
var r = NSRange()
let attrDictionary = attrString?.attributes(at: location, effectiveRange: &r)
if attrDictionary != nil {
let attachment = attrDictionary![NSAttachmentAttributeName] as? NSTextAttachment
if attachment != nil {
if attachment!.image != nil {
imageArray.append( attachment!.image!)
}
}
location += r.length
}
}
}
}
}
这篇关于如何使用nsattributedstring在Swift中将图像添加为文本附件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!