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