[iOS] CATextLayerでiOS6になると、なんか上にパディングがあるみたい

2012/11/21

こんにちは。きんくまです。

いま自作アプリのHabitKeeperのアップデート作業をしているところです。
一気にいろいろと機能を盛り込みたいところなんだけど、
書き出してみたら作業にくじけそうになったので、
細かく分けてバージョンを上げていこうと思ってます。
OCUnitとかGHUnitとかユニットテストをなんとか試しに盛り込みつつやっとります。
これであってるのかわかんないんだけどね、、。

さて、それで、作業をすすめている途中でCATextLayerの挙動にキョドったので、メモです。
CATextLayerでiOS5だとframeの上らへんぎりぎりに文字が描画されるんですが、
iOS6だと微妙なすきまができて、文字が描画されてしまいました。

それで、ググったところ、StackOverFlowさんで書かれてました。
>> ipad – Unwanted Vertical Padding from iOS 6 on CATextLayer – Stack Overflow

t0rstさんが言うにはそうなるフォントとならないフォントがあるみたいです。
Helvetica-Boldはなるから、Helvetica-Nueue使うと大丈夫だよ。とか、
アセンダー、ディセンダーがどうとか書いてあります。
アセンダー、ディセンダーはタイポグラフィの用語ですね。文字の部分的な高さとかを表してます。

>> 2008-08-23 – WEBの細道 ―WEB修行と、仕事と、時々、旅―

なんで、実際のものと見比べてみました。
するとHelvetica-Boldのとき(システムの英語での太字)はキャップハイトからxハイトの差分をとった値が問題の微妙な隙間っぽく見えました。
それでそいつを使ったところ、iOS5とぴったり一致しました。
両方のキャプチャとって重ねたら「完全に一致」ってやつだったので、大丈夫かと思われ。

バージョン判定部分はこのページのyasirmturkさんからいただきました。

    CATextLayer *mytextLayer = [CATextLayer layer];
    CGFloat fontSize = 30;
    UIFont *boldFont = [UIFont boldSystemFontOfSize:fontSize];
    mytextLayer.font = (__bridge CFTypeRef)(boldFont.fontName);
    mytextLayer.fontSize = fontSize;

    CGFloat offsetY = 0;

    //if system version is grater than 6
    if(([[[UIDevice currentDevice] systemVersion] compare:@"6" options:NSNumericSearch] == NSOrderedDescending)){
        offsetY = -(boldFont.capHeight - boldFont.xHeight);
    }

    //you have to set textX, textY, textWidth
    mytextLayer.frame = CGRectMake(textX, textY + offsetY, textWidth, fontSize);

んで、StackOverFlowにも初投稿しておきますた。

LINEで送る
Pocket

自作iPhoneアプリ 好評発売中!
フォルメモ - シンプルなフォルダつきメモ帳
ジッピー電卓 - 消費税や割引もサクサク計算!

LINEスタンプ作りました!
毎日使える。とぼけたウサギ。LINEスタンプ販売中! 毎日使える。とぼけたウサギ

ページトップへ戻る