ラベル Objective-C の投稿を表示しています。 すべての投稿を表示
ラベル Objective-C の投稿を表示しています。 すべての投稿を表示

2008/03/13

attachmentを削除する

NSAttributeStringから通常の文字列を取得するには, +(NSString*) stringを用います.しかしながら, NSTextAttachmentで画像等を含ませていた場合, 見た目には何も問題がないのですが,「見えない文字」が入っています. ドキュメントを見ると「attachment charactersを除く処理はしないから, NSTextのstringを使ってね」と書いてありますが, NSTextは viewなのでちょっと面倒です.そんな訳でattachmentを削除する方法です.

これは, コトノコの複合検索で検索語に画像が入っていた場合, NSTokenFieldに渡す時に使っています.

IKImageBrowserViewを使う

IKImageBrowserView

前回に続いて外字一覧ウィンドウの話. NSCollectionViewは速度的に問題があったので,Image Kitに含まれるIKImageBrowserViewを使ってみました. 結論からいくと画像ブラウザを指向しているだけあって速度的には問題なし.ただ, バグがまだまだ多いのかなという感じでした.

外字一覧ウィンドウは辞書を変更する度に中身が変わります. で, 頻繁に内容を入れ替えていると落ちる.こっちでrelease済みのデータにアクセスしている感じです. 仕方ないので, ガベージコレクションを入れると落ちなくなるのですが, リークメモリが凄い事になります. 使い物になるにはしばらくかかりそうです.

2008/02/29

NSCollectionViewを使う

コトノコで辞書の外字一覧を表示させるウィンドウ. いままではNSTableViewを用いて一覧を表示させていましたが,辞書によっては5000近くの外字があり, 表示されるまでが遅いし, 使いにくいという問題がありました.そこで, 文字パレット位のレスポンスを期待してMac OS X 10.5から追加されたNSCollectionViewを使ってみました.

結論からいくと, 5000個のエントリを表示させるには遅すぎて使えません.NSViewを使っているので重いという話はあったのですが, とりあえず使ってみるとやはり重い.コトノコに使う事はないですが, 備忘録も兼ねて使い方をまとめておきます.

2008/02/20

レンダリングにWebKitを使う

コトノコのビュー画面にWebViewを使う事を考えてきましたが, うまく結合文字を表示させる事ができないので,コトノコの辞書内容表示としては使えません. 他の用途になら十分なのでしょうけどね.

ただ, HTML + NSURLProtocolの方が便利な事も多い訳で, どうするかなぁと考えていると, NSAttributeStringの initWithHTML: options: documentAttributes:は10.4からレンダリングにWebKitを使っているとの事.使ってみると, NSURLProtocolで定義した独自プロトコルも普通に呼んでくれます. NSTextViewにレンダリングしたテキストを流し込むと結合文字もちゃんと処理してくれています.結局これで行く事にしました.

2008/02/13

結合文字の取扱い

結合文字

WebView版のコトノコを使っていると, 外字の表示が崩れている箇所があったりします.よく調べてみると結合文字の取扱いがおかしい様です.音声記号のI (LATIN LETTER SMALL CAPITAL I) にアクセント記号 (COMBINING ACUTE ACCENT) をつけたものをNSTextViewに表示させたものと, Safariで表示させたものの比較が右の図です.NSTextViewではきちんと上にアクセントがきているのが, Safariでは表示できていないのが分かります.

一番右にあるのは, 合成用記号にある "COMBINING ACUTE TONE MARK"をつけたものです.こちらの方は, Safariでもヒラギノ角ゴ (下) ではきちんと表示されています. 普通のアプリでは問題ないのでしょうが, 辞書アプリであるコトノコではちょっと問題です.

(ちなみに, Safariのデバッグメニューにある「Use ATSUI for All Text」を入れても同じ結果でした.)

検索する

検索結果

Safari 3.0から追加された検索文字列がポップアップするあのインタフェース. WebKitを使えばすぐに実装できるかと思っていたのですが, 現実はそうは甘くはありませんでした.

WebViewで提供されている検索メソッドは, searchFor:direction:caseSensitive:wrap: ただしこれは検索ダイアログ用のメソッドで, コトノコの様なレイアウトだと, ターゲットを持って行かれるので使えません.NSTextViewにはshowFindIndicatorForRange:なんてメソッドが追加されたのにWebViewでは使えないのです.

2008/02/05

スタイルシートを追加する

テキストビューワとして素のWebViewを利用した場合, お世辞にも見やすいとは言えません. そこで, スタイルシートで指定してレイアウトを変更します.

スタイルシートの指定方法は2つ.

  • WebPreferencesのsetUserStyleSheetLocation:で指定
  • HTMLのヘッダで指定

スタイルシート自身は、ファイルを作成して file: プロトコルを使って指定しても良いですし、新しいプロトコルを定義して動的に生成してもかまいません。

2008/02/01

NSTextViewの代わりにWebViewを使う

アプリの中にはテキストを表示するものが多くあります. メールアプリのメール本文, 辞書表示アプリの辞書内容表示部分など. これらの表示部分にはNSTextViewが利用されている事が多いです. フォントや色の変更も自由ですし画像も張り込めますしなんら問題ないのですが, WebViewを代わりに使おうと思って調べてみました.技術的に面白そうという事もありますし, HTMLで自由にレイアウト変更ができるので, 楽になるんじゃないかな? という事もあります. (※NSTextViewはHTMLを読み込めます). 題材としては, 辞書ビューワのコトノコを使います.

通常, NSTextViewをビューワとして使う場合には, 表示するテキストを成形して setAttributedString:で設定という流れです. 一方, WebViewを使う場合には, URLを設定して(正確には NSURLRequestをWebViewに送って)その内容をWebViewが表示するという流れになります.

あらかじめ, HTMLファイルがある場合は file: プロトコルでファイルを直接指定すれば良いのですが, 辞書内容等を全部HTMLで書き出すのは現実的ではありません. そこで, eb: というプロトコルを新たに定義してそれを指定します. そしてそのプロトコルを処理するのが, NSURLProtocolです.