読者です 読者をやめる 読者になる 読者になる

ObjecTips

基本Objective-Cで iOS とか OS X とか

iOS 8リマインダーアプリの挙動調査 その2

Tips Reminders.app UIPasteboard NSAttributedString NSTextAttachment NSFileWrapper

前回の内容は以下

優先順位の !!!UITextView の中に含まれている事が分かった。

f:id:Koze:20150622233303p:plain

これをコピーすると何が入っているのか。
UIPasteboard を使って中身を見てみた。

すると pasteboardTypes には

(
    "com.apple.flat-rtfd",
    "public.utf8-plain-text",
    "Apple Web Archive pasteboard type"
)

items には

(
        {
        "Apple Web Archive pasteboard type" = <3c21444f ... 746d6c3e 0a>;
        "com.apple.flat-rtfd" = <72746664 ... ae426082>;
        "public.utf8-plain-text" = \U30bf\U30a4\U30c8\U30eb;
    }
)

といった具体的な内容が入っていた。(上2つのデータ内容は省略表記している)
調べてみると Web Archive 形式の方は中身を取得するのにはいろいろ面倒な様なので、rtfd形式の方の中身を見てみる。
以下のコードで rtfd 形式の NSData から NSAttributedString を作成する。

ログ出力の結果は以下

{
    NSAttachment = "<NSTextAttachment: 0x1742ab460> \"Attachment.png\"";
    NSFont = "<UICTFont: 0x13dd0ae90> font-family: \"Helvetica\"; font-weight: normal; font-style: normal; font-size: 12.00pt";
    NSParagraphStyle = "Alignment 0, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 0/0, LineHeightMultiple 0, LineBreakMode 0, Tabs (\n    28L,\n    56L,\n    84L,\n    112L,\n    140L,\n    168L,\n    196L,\n    224L,\n    252L,\n    280L,\n    308L,\n    336L\n), DefaultTabInterval 36, Blocks (null), Lists (null), BaseWritingDirection -1, HyphenationFactor 0, TighteningFactor 0, HeaderLevel 0";
}タイトル{
    NSFont = "<UICTFont: 0x13dd0ae90> font-family: \"Helvetica\"; font-weight: normal; font-style: normal; font-size: 12.00pt";
    NSParagraphStyle = "Alignment 0, LineSpacing 0, ParagraphSpacing 0, ParagraphSpacingBefore 0, HeadIndent 0, TailIndent 0, FirstLineHeadIndent 0, LineHeight 0/0, LineHeightMultiple 0, LineBreakMode 0, Tabs (\n    28L,\n    56L,\n    84L,\n    112L,\n    140L,\n    168L,\n    196L,\n    224L,\n    252L,\n    280L,\n    308L,\n    336L\n), DefaultTabInterval 36, Blocks (null), Lists (null), BaseWritingDirection -1, HyphenationFactor 0, TighteningFactor 0, HeaderLevel 0";
}

タイトル 以降のデータが文字列 タイトル の中身で、それ以前のデータが !!! の部分の中身になっている。
Attachment.png で作成された NSTextAttachment クラスが存在しているので、!!! の部分は画像という事になる。

NSTextAttachment の中身をさらに見ていく。

attachment は image contentsnilfileType は public.png
fileWrapper が設定されていたので NSFileWrapper を取得してそこからさらに fileWrapper の中身を見ていく。

fileWapper の attributes

    NSFileModificationDate = "2015-06-22 13:45:49 +0000";
    NSFilePosixPermissions = 438;
    NSFileType = NSFileTypeRegular;

regularFileContents でコンテンツの NSData が取得でき、そこから UIImage を生成する事が出来た。

最終的に取得できた UIImageNSAttributedString をそれぞれ UIImageViewUITextView に表示してみると以下のようになった。

f:id:Koze:20150622234830p:plain

という事でまとめとしては、
リマインダーアプリの優先順位の表示 !!!NSFileWrapperregularFileContents へ画像データを設定し、そこから作成された NSTextAttachment を attributes として持つ NSAttributedStringUITextView に表示。
という事になる。