在开始之前,请允许我承认存在类似的问题,有些有答案,有些没有。但是,它们不能解决我的特定问题。如果您知道任何信息,请转给我。
现在,当我将图片添加到时,我将图片UITextView放置在光标所在的位置。我通过每次添加5个空格来为图像腾出空间来实现此目的。光标移到的末尾时UItextView,除非我键入一个键,否则它将停留在该位置而不会自动移动到下一行。即使我添加空格,它也仍然停留在那里,因此我的图像只是堆积在那里。我决定添加一个换行符,"\n"以将其手动移至下一行。现在我有两个问题。首先,即使我有类似这样的情况,也只能显示角落的部分图像:
UITextView
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。我一直努力做到这一点,直到向我建议了以下解决方案。效果很好。希望它能帮助某人。
WhatsApp
如果我了解您的目标以及当前的实现方式。您应该检查是否需要先返回。
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)
现在,图像已内联,并且像文本一样对待。如果用户在其上退格,它将像文本一样删除。