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

面白きことは良きことなり

拙く未熟なiOSエンジニアの備忘録と戯言

2016/06/08 備忘録

バグの原因がわからないなーと少し嵌ったところ。

sizeWithAttributes:の挙動がiOS7と8以降で異なっていた。
正直もうiOS7のサポートも切られるのも普通になりつつあるから、今後出くわすことはないと思うけど、残しておく。

前提:NSAttributeString型で文字列"ぼくはクマ\n"があったとする。
iOS7の時、末尾に改行があっても無視される。
→ UILabelに問題なく収まり折り返すことがない時、CGSizeのheightには文字列1行分の高さが入っている

iOS8以降の時、末尾の改行が考慮される。
→ UILabelに問題なく収まり折り返すことがない時、CGSizeのheightには文字列2行分の高さが入っている

どうも\nの改行がある時点で2行目が存在するとiOS8以降では認識されているらしい。
まぁ、2行目は空文字と考えれば正しい気もする。


簡単な解決策であれば、iOS7に合わせることになるが、末尾に改行がある時はそれを削除してやるだけでOK
安易でしかも旧iOSに合わせてるあたりやりかたとしては良くないけどね。

NSString *string = @"ぼくはクマ\n"
// 末尾に改行文字があれば削除
if ([string hasSuffix:@"\n"]) {
        string = [string stringByReplacingCharactersInRange:NSMakeRange(string.length - 1, 1) withString:@""];
}
NSLog(@"%@", string);    // ぼくはクマ

StackOverflow先生でもiOS7と8以降で挙動ちげぇよって話が出てる
stackoverflow.com


意図的に文字列の始まりや終わりに改行が入ることがなければ、下記の方法でまとめて改行を取り除ける。

NSString *string = @"\n\nHello, \nWorld\n\n"; 
string = [string stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];
NSLog(@"%@", string);    // Hello, \nWorld

stackoverflow.com