Desire for wealth

PV : 10009674 / Owner : Nihondo

だめちゅんにっき

前の記事:« 1年越しの夢かなう〜ステレオハック開始

次の記事:理奈ザウにっき(4) »

4月 1日(木)

ココア図書館 #03 - 決められた幅に収まるようにフォントサイズを調整する

ココア図書館CV:斎藤千和で人里離れた山の奥にある小さなサイト。そこにはゆかり姫ラブな管理人と、女医ハック狂いの管理人と、Cocoa の勉強を始めた管理人がいるのです(←もう3回目)。

HackENT で表示される文字列のフォントサイズはまちまちです。例えば、次のような感じです。

これは、決められた幅(この例の場合、ウィンドウの横幅)に対して、はみ出さないようにフォントサイズを調整して描画しているからです。歌詞の行のうちで、最大の長さのものが、折り返さないで画面内に表示できるようにフォントサイズを変えてやるわけです。

上記の例は、曲名表示のスクリーンショットですが、歌詞の表示にもこれは当てはまります。

「ええと、歌詞のなかで一番長い行が何文字だから…、フォントサイズこれだったら画面に収まるかなぁ?」みたいなことを、データ作成者が考えなくてもいいようにしたかったからです。見やすさのためには、できるかぎり大きな文字で表示したいけど、フォントサイズの制御はユーザには意識させないようにという思想です。

あまりいいネタではないですが、また使いそうなので、ここに記しておきます。NSString の sizeWithAttributes を用いて、描画する際の幅を算出しています。

#03 - 決められた幅に収まるようにフォントサイズを調整する
- (float) adjustFontSize:(NSString *)writeStr
           withAttribute:(NSMutableDictionary *)fontAttribute maxWidth:(float)maxWidth
/*
    writeStr : 描画する文字列
    fontAttribute :  フォント属性
    maxWidth : 文字列をおさめたい横方向のサイズ
*/
{
    /* フォントサイズを取り出す */
    float fontSize = [[fontAttribute objectForKey:@"NSFontAttributeName"] pointSize] / 10;
    /* 指定したフォント属性で文字列を描画したときの幅を求める */
    float strWidth = [writeStr sizeWithAttributes:fontAttribute].width;

    /* 書いてみたら決められた幅からはみ出してしまうとき */
    if( strWidth > maxWidth ){
        /* フォントサイズの補正 */
        fontSize *= maxWidth / strWidth;
    }
return( fontSize ); }

といった感じで、strWidth(描画しようとしている文字列の幅)が、maxWidth(収めたい幅)を超えたときに、フォントサイズを小さくして対応しようというものです。

引数の fontAttribute は例えば以下のように設定します。

    [fontAttribute setObject:[NSFont fontWithName:@"Osaka" size:64] forKey:NSFontAttributeName];

Osaka の 64 ポイントで描画したときに 1280 ピクセルの幅になってしまうような文字列があったとして、それを 640 ピクセルに収めたければ、フォントサイズを(640/1280)倍してやればいいという理屈ですね。説明するまでもないか。

亜流としてフォントサイズを変えないで、NSAffineTransform で、アフィン変換をかけるという手もあります。

    NSAffineTransform *scaleMatrix;

    scaleMatrix = [NSAffineTransform transform];
    [scaleMatrix scaleXBy:maxWidth / strWidth yBy:1.0];
    [scaleMatrix concat];

こんな風にしておけば、フォントの横方向を縮めて、縦長文字で描画してくれますよね。drawAtPoint で実際に描画するポイントもアフィン変換されることに気をつけておきます。

もうひとつ気をつけることがあって「アフィン変換」じゃなくて、「あひーっ!変換」をすると、描画しようとする文字列はおかしくなってしまうでよ。あひーっ!(←もうやめたほうがいいてすかね)

4/ 1 01:21
この記事への トラックバック(0)/ひとこと(0)▼

What are you doing? (twitter)

最近の記事

箱が巨大すぎる「ハイパースティック PRO オトメディウスG ver.」で繊細なパイタッチをだな…こう…。 - 11/20 @466

Wii 版 FIFA 09 ALL-PLAY はもっとウイイレプレーメーカーをパクればよかったのに! - 11/10 @602

FIFA 09 クラブマッチにみるお国柄〜中国カンフーサッカーの脅威 - 11/ 5 @238

なぜかアマゾンでアダルト商品になってる「いいなり!あいぶれーしょん 雫石」フィギュア - 11/ 2 @533

今日発売の PHS300 に今日発売のニンテンドー DSi をつないでみたよ - 11/ 1 @142

実はサーバ機能が隠されていた「ワイヤレスゲート ホームアンテナ for イー・モバイル」 - 10/22 @629

イモバ回線で AP を作る「ワイヤレスゲート ホームアンテナ for イー・モバイル」が突然発売 - 10/21 @514

携帯機で新たに生まれ変わった「カルドセプトDS」の遊びやすさがすごい - 10/15 @348

「秋だ、一番!ゆかりちゃん祭り!」京都公演で11年前の渋チュねたが! - 10/14 @807

「秋だ、一番!ゆかりちゃん祭り!」名古屋公演が楽しすぎた - 10/13 @767

さらに以前の記事へ