一尘不染

在UITextView中合并文本和图像

swift

在开始之前,请允许我承认存在类似的问题,有些有答案,有些没有。但是,它们不能解决我的特定问题。如果您知道任何信息,请转给我。

现在,当我将图片添加到时,我将图片UITextView放置在光标所在的位置。我通过每次添加5个空格来为图像腾出空间来实现此目的。光标移到的末尾时UItextView,除非我键入一个键,否则它将停留在该位置而不会自动移动到下一行。即使我添加空格,它也仍然停留在那里,因此我的图像只是堆积在那里。我决定添加一个换行符,"\n"以将其手动移至下一行。现在我有两个问题。首先,即使我有类似这样的情况,也只能显示角落的部分图像:

if ((cursorPosition.x + 30) >= message.frame.width) {

        message.text = message.text.stringByAppendingString("\n");
    }
    else {
        message.text = message.text.stringByAppendingString("      ");
    }

如何解决此问题,使其不会脱离框架?

其次,因为是手动添加新行,所以当我删除文本时,光标会移到某个对我来说很奇怪的任意位置。例如,我可能要删除第4行的文本,但它只会跳到第2行。关于如何解决这两个问题的任何建议将不胜感激。以下是UITextView外观:

编辑:我正在对此进行编辑,以帮助可能遇到类似问题的任何人。我想创建一个应用程序,用户可以像在此一样将文本和图像添加在一起WhatsApp。我一直努力做到这一点,直到向我建议了以下解决方案。效果很好。希望它能帮助某人。


阅读 254

收藏
2020-07-07

共1个答案

一尘不染

如果我了解您的目标以及当前的实现方式。您应该检查是否需要先返回。

if ((cursorPosition.x + 30) >= message.frame.width) {
    message.text = message.text.stringByAppendingString("\n");
}

然后,您应该获得当前的光标位置,并在其中添加UIImageView。

    let size = CGSize(width: 30, height: 30);
    let img = UIImage(named: change_arr[indexPath.row]);
    let addImg = UIImageView(image: UIImage(named: change_arr[indexPath.row]));
    addImg.frame = CGRect(origin: newCursorPosition, size: size);
message.addSubview(addImg);

然后如果您需要添加空格,请立即添加。

如之前的评论所述,使用NSTextAttachment将简化所有这些操作,并避免您不得不创建UIViews等。

它看起来像这样,您不需要检查光标位置,因为它可以像处理文本一样处理它。

//create your UIImage
let image = UIImage(named: change_arr[indexPath.row]);
//create and NSTextAttachment and add your image to it.
let attachment = NSTextAttachment()
attachment.image = image
//put your NSTextAttachment into and attributedString
let attString = NSAttributedString(attachment: attachment)
//add this attributed string to the current position.
textView.textStorage.insertAttributedString(attString, atIndex: textView.selectedRange.location)

现在,图像已内联,并且像文本一样对待。如果用户在其上退格,它将像文本一样删除。

2020-07-07