Скопируйте текст с его шрифтом в UIPasteboard [duplicate]

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

9
задан Kara 2 April 2014 в 18:45
поделиться

4 ответа

Я обнаружил, что когда я (как пользователь приложения) копирует богатый текст из UITextView в картотеку, картон содержит два типа:

"public.text",
"Apple Web Archive pasteboard type

Исходя из этого, я создал удобная категория на UIP борту. (С большим использованием кода из этот ответ ).

Он работает, но: преобразование в формат html означает, что я потеряю пользовательские атрибуты. Любое чистое решение будет с радостью принято.

Файл UIPasteboard + AttributedString.h:

@interface UIPasteboard (AttributedString)

- (void) setAttributedString:(NSAttributedString *)attributedString;

@end

Файл UIPastboard + AttributedString.m:

#import <MobileCoreServices/UTCoreTypes.h>

#import "UIPasteboard+AttributedString.h"

@implementation UIPasteboard (AttributedString)

- (void) setAttributedString:(NSAttributedString *)attributedString {
    NSString *htmlString = [attributedString htmlString]; // This uses DTCoreText category NSAttributedString+HTML - https://github.com/Cocoanetics/DTCoreText
    NSDictionary *resourceDictionary = @{ @"WebResourceData" : [htmlString dataUsingEncoding:NSUTF8StringEncoding],
    @"WebResourceFrameName":  @"",
    @"WebResourceMIMEType" : @"text/html",
    @"WebResourceTextEncodingName" : @"UTF-8",
    @"WebResourceURL" : @"about:blank" };



    NSDictionary *htmlItem = @{ (NSString *)kUTTypeText : [attributedString string],
        @"Apple Web Archive pasteboard type" : @{ @"WebMainResource" : resourceDictionary } };

    [self setItems:@[ htmlItem ]];
}


@end

Только реализованный сеттер. Если вы хотите написать геттер и / или поместить его на GitHub, будьте моим гостем:)

9
ответ дан Community 19 August 2018 в 12:19
поделиться
  • 1
    +1, но это сеттер, а не геттер;) – user 26 September 2012 в 15:55
  • 2
    @ H2CO3 Спасибо :) Обновлен ответ. – Guillaume 26 September 2012 в 15:57
  • 3
    @ThomasTempelmann спасибо, отредактирован! – Guillaume 12 March 2013 в 18:24
  • 4
    Нет использования DTCoreText. Преобразуйте это в HTML: NSDictionary * documentAttributes = [словарь NSDictionaryWithObjectsAndKeys: NSHTMLTextDocumentType, NSDocumentTypeDocumentAttribute, nil]; \n NSData * htmlData = [атрибутString dataFromRange: NSMakeRange (0, attribitedString.length) documentAttributes: documentAttributes error: NULL]; \n NSString * htmlString = [[NSString alloc] initWithData: htmlData encoding: NSUTF8StringEncoding]; – Muzammil 8 September 2014 в 15:40

Подход Гийома, использующий HTML, не работает для меня (по крайней мере, в iOS 7.1 beta 5).

Чистое решение заключается в том, чтобы вставить NSAttributedStrings в виде RTF (плюс резервное копирование с открытым текстом) в палитру:

- (void)setAttributedString:(NSAttributedString *)attributedString {
    NSData *rtf = [attributedString dataFromRange:NSMakeRange(0, attributedString.length)
                               documentAttributes:@{NSDocumentTypeDocumentAttribute: NSRTFTextDocumentType}
                                            error:nil];
    self.items = @[@{(id)kUTTypeRTF: [[NSString alloc] initWithData:rtf encoding:NSUTF8StringEncoding],
                     (id)kUTTypeUTF8PlainText: attributedString.string}];
}

Swift 2.3

public extension UIPasteboard {
  public func set(attributedString: NSAttributedString?) {

    guard let attributedString = attributedString else {
      return
    }

    do {
      let rtf = try attributedString.dataFromRange(NSMakeRange(0, attributedString.length), documentAttributes: [NSDocumentTypeDocumentAttribute: NSRTFTextDocumentType])
      items = [[kUTTypeRTF as String: NSString(data: rtf, encoding: NSUTF8StringEncoding)!, kUTTypeUTF8PlainText as String: attributedString.string]]

    } catch {

    }
  }
}

Swift 3

import MobileCoreServices
public extension UIPasteboard {
  public func set(attributedString: NSAttributedString?) {

    guard let attributedString = attributedString else {
      return
    }

    do {
      let rtf = try attributedString.data(from: NSMakeRange(0, attributedString.length), documentAttributes: [NSDocumentTypeDocumentAttribute: NSRTFTextDocumentType])
      items = [[kUTTypeRTF as String: NSString(data: rtf, encoding: String.Encoding.utf8.rawValue)!, kUTTypeUTF8PlainText as String: attributedString.string]]

    } catch {

    }
  }
}
9
ответ дан Milan Kamilya 19 August 2018 в 12:19
поделиться

Менеджер картона в OSX может автоматически конвертировать между большим количеством текстовых и графических типов.

Для богатых текстовых типов вы обычно помещаете RTF в картон. Вы можете создать RTF-представление из атрибутной строки и наоборот. См. «Ссылка на дополнения набора приложений NSAttributedString».

Если у вас есть изображения, включенные также, используйте RTFd вместо флейта RTF.

Я не знаю типы MIME для (я привык к API Carbon Pasteboard, а не к Cocoa), но вы можете конвертировать между UTI, Pboard и MIME-типами с использованием API UTType.

UTI для RTF является «public.rtf» , для RTFd это «com.apple.flat-rtfd».

-1
ответ дан Thomas Tempelmann 19 August 2018 в 12:19
поделиться
  • 1
    Это вопрос iOS. – Guillaume 12 March 2013 в 12:34
  • 2
    К сожалению, этот маленький "ios" тег легко упустить. И у iOS нет встроенного RTF-преобразования. Bummer. – Thomas Tempelmann 12 March 2013 в 13:41
  • 3
    Согласовано. Обычно, когда тег является единственным способом увидеть его, я указываю его в вопросе. Я не сделал этого, потому что думал, что UIPastboard будет достаточно. Извините за неясность. – Guillaume 12 March 2013 в 18:23
  • 4
    О, UIP. Да, я мог заметить это. Я так много работаю над iOS и OSX, что все время путаю их несколько иначе названные классы :) – Thomas Tempelmann 12 March 2013 в 23:26

Это довольно просто:

  #import <MobileCoreServices/UTCoreTypes.h>

  NSMutableDictionary *item = [[NSMutableDictionary alloc] init];

  NSData *rtf = [attributedString dataFromRange:NSMakeRange(0, attributedString.length)
                             documentAttributes:@{NSDocumentTypeDocumentAttribute: NSRTFDTextDocumentType}
                                          error:nil];

  if (rtf) {
    [item setObject:rtf forKey:(id)kUTTypeFlatRTFD];
  }

  [item setObject:attributedString.string forKey:(id)kUTTypeUTF8PlainText];

  UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
  pasteboard.items = @[item];
0
ответ дан Valentin Shergin 19 August 2018 в 12:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: