在`UITextView`中组合文本和图像

Mic*_*oyo 1 ios swift

在开始之前,让我承认存在类似的问题,一些有答案,另一些没有答案.但是,它们没有解决我的具体问题.如果您知道,请转介我.

现在,当我添加图像时UITextView,我将图像放在光标所在的位置.我通过每次附加5个空格来实现这一点,为图像腾出空间.当光标到达末尾时UItextView,它会一直停留在那里而不会自动移动到下一行,除非我键入一个键.即使我附加空格,它仍然留在那里,所以我的图像只是堆积在那里.我决定添加换行符"\n"以手动将其移动到下一行.现在我有两个问题.首先,即使我有以下条件,只有角落的部分图像显示:

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

        message.text = message.text.stringByAppendingString("\n");
    }
    else {
        message.text = message.text.stringByAppendingString("      ");
    }
Run Code Online (Sandbox Code Playgroud)

我如何解决这个问题,使它不会走出框架?

其次,因为我手动添加新行,当我删除文本时,光标移动到某个任意位置,这对我来说很奇怪.例如,我可能正在删除第4行的文本,但它只会跳到第2行.任何关于如何解决其中一个或两个的建议都将非常感激.下面是这样的UITextView样子:

编辑:我正在编辑这个,以帮助任何可能有类似问题的人.我想创建一个应用程序,用户可以像我们一样添加文本和图像WhatsApp.我努力做到这一点,直到我建议下面的解决方案.它很棒.希望它可以帮助某人.

Jer*_*ope 10

如果我了解您的目标,以及您目前如何实施它.您应该先检查是否需要退货.

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

然后你应该获得当前的光标位置,并在那里添加你的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);
Run Code Online (Sandbox Code Playgroud)

然后,如果您需要添加空格,请立即添加它们.

如前面的评论中所述,使用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)
Run Code Online (Sandbox Code Playgroud)

现在图像是内联的,并且像文本一样处理.如果用户对其进行退格,则删除就像文本一样.