Скопируйте Вставьте NSAttributedString во внешнее приложение iOS
Новое в Swift и iOS. Я пытаюсь разрешить пользователю скопировать строку nsattributedstring в мое приложение и вставить ее в Mail, iMessage или любое другое приложение, которое он выберет.
@IBAction func action(sender: UIButton!) {
let stringAttributes = [
NSFontAttributeName: UIFont.boldSystemFontOfSize(14.0),
NSBackgroundColorAttributeName: UIColor.redColor(),
]
let attributedString = NSMutableAttributedString(string: "Hello world!", attributes: stringAttributes)
do {
let documentAttributes = [NSDocumentTypeDocumentAttribute: NSRTFTextDocumentType]
let rtfData = try attributedString.dataFromRange(NSMakeRange(0, attributedString.length), documentAttributes: documentAttributes)
if let rtfString = String(data: rtfData, encoding: NSUTF8StringEncoding) {
let pb = UIPasteboard.generalPasteboard()
return pb.string = rtfString
}
}
catch {
print("error creating RTF from Attributed String")
}
}
При вставке это возвращает:
Привет, мир!{ NSBackgroundColor = "UIDeviceRGBColorSpace 1 0 0 1";NSFont = " font-family:\".SFUIText-Semibold\"; font-weight: bold; font-style: normal; font-size: 14.00pt"; }
Отредактированный код возвращает:
{\ rtf1 \ ansi \ anscipg1252 {fontal \ f0 \ fnil \ fcharset0.SFUIText-Semibold;} {\ colortbl; \ red255 \ green255 \ blue255; \ red255 \ green0 \ blue0;} \ pard \ tx560 \ tx1120 \ tx1680... \ pardirnatural \ partightenfactor0 \ f0 \ b \ fs28 \ cf0 Привет, мир!
Проводя исследование, я наткнулся на этот ответ, но не смог заставить его работать из ответа Леонарда Паули. Может потому, что это только внутри приложения, а не вставляется в другое? Извините, если это дубликат этого вопроса. Вставить форматированный текст, а не изображения или HTML
Я также не мог перевести этот текст копирования с форматированием - iOS 6 NSAttributedString в Pasteboard для быстрого
Я могу вставить обычный текст, а не текст с любыми атрибутами.
2 ответа
для свифт 5
func copyAttributedStringToPB() {
let stringAttributes = [
NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 14.0),
NSAttributedString.Key.backgroundColor: UIColor.red,
]
let attributedString = NSMutableAttributedString(string: "Hello world!", attributes: stringAttributes)
do {
let documentAttributes = [NSAttributedString.DocumentAttributeKey.documentType: NSAttributedString.DocumentType.rtf]
let rtfData = try attributedString.data(from: NSMakeRange(0, attributedString.length), documentAttributes: documentAttributes)
let pb = UIPasteboard.general
pb.setData(rtfData, forPasteboardType: kUTTypeRTF as String)
}
catch {
print("error creating RTF from Attributed String")
}
}
Я обновил ваш код, чтобы правильно сохранить данные RTF, которые вы создаете, на монтажном столе, однако загружая данные RTF и помещая их обратно в NSAttributedString
объект, кажется, ручная задача.
Таким образом, поведение копирования и вставки будет работать только в тех случаях, когда разработчик явно поддерживал копирование и вставку данных RTF таким способом.
К сожалению, в игровых площадках, в которых я тестировал код, свойство строки в Pasteboard настроено так, чтобы содержать текстовую версию RTF-данных в виде текста (которая полна разметки и странных управляющих символов). Мне не удалось найти решение, которое решает эту проблему, а это означает, что приложения, которые не поддерживают RTF таким образом, могут по-прежнему вставлять размеченный открытый текст RTF вместо приписанного текста...:(
Это поможет вам в этом (в приложении копировать-вставить RTF), но, очевидно, не очень. Мои проекты также основаны на таком поведении, поэтому, если у кого-то есть дополнительные идеи, я также хотел бы знать.
import MobileCoreServices
// ----- Copy ------
func copyAttributedStringToPB() {
let stringAttributes = [
NSFontAttributeName: UIFont.boldSystemFontOfSize(14.0),
NSBackgroundColorAttributeName: UIColor.redColor(),
]
let attributedString = NSMutableAttributedString(string: "Hello world!", attributes: stringAttributes)
do {
let documentAttributes = [NSDocumentTypeDocumentAttribute: NSRTFTextDocumentType]
let rtfData = try attributedString.dataFromRange(NSMakeRange(0, attributedString.length), documentAttributes: documentAttributes)
let pb = UIPasteboard.generalPasteboard()
pb.setData(rtfData, forPasteboardType: kUTTypeRTF as String)
}
catch {
print("error creating RTF from Attributed String")
}
}
// -------- Paste -------
let pb = UIPasteboard.generalPasteboard()
let data = pb.dataForPasteboardType(kUTTypeRTF as String)
let pastedAttributedString = try! NSAttributedString(data: data!, options: [NSDocumentTypeDocumentAttribute: NSRTFTextDocumentType], documentAttributes: nil)