先週、NSAttributedStringが表示されないというシミュレータのバグについて質問しました: iOS 7シミュレータのバグ-NSAttributedStringが表示されません
残念ながら、これはシミュレータのバグではなく、iOS 7のバグであるようです。この問題をiPhone 5デバイスで再現しました。
バグは、NSAttributedStringの属性としてNSUnderlineStyleAttributeNameとNSParagraphStyleAttributeNameを組み合わせて使用しているようです。
私はこれまで2つのiOS 7デバイスでのみテストしており、問題はそのうちの1つでのみ発生しました。両方がまったく同じバージョンにアップグレードされた後でも:
iOS 7.0搭載の最初のiPhone 5(11A465):テキストが表示されない
7.0.2(11A501)にアップグレードした後の最初のiPhone 5:テキストが表示されない
iOS 7.0(11A4449d)を実行している2番目のiPhone 5:テキストが正しく表示されます
7.0.2(11A501)にアップグレードした後の2番目のiPhone 5:テキストが表示されない
AppleこのバグはiOS 7.0(11A4449d)以降に導入されたようです。私は彼らにバグを報告しました。私が受け取ったすべての応答で更新します。
バグを再現する手順
IOS 7.0.2を実行している場合は、このバグを再現できるはずです。
このプロジェクトをダウンロードしてデバイスに実行する https://github.com/rohinnz/iOS-7-BUG---NSAttributedString-does-not-appear
または
1)Xcode 5で、新しい「シングルビューアプリケーション」を作成します。なんでも呼んで。
2)ViewController.mで、viewDidLoadメソッドを次のように置き換えます。
- (void)viewDidLoad
{
[super viewDidLoad];
NSMutableParagraphStyle* paragraph = [[NSMutableParagraphStyle alloc] init];
paragraph.alignment = NSTextAlignmentCenter;
NSAttributedString* attrStr = [[NSAttributedString alloc] initWithString:@"Lorem ipsum dolor sit" attributes:
@{NSUnderlineStyleAttributeName:@(NSUnderlineStyleSingle),
NSParagraphStyleAttributeName:paragraph}];
UILabel* myLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 30, 0, 0)];
myLabel.backgroundColor = [UIColor greenColor];
myLabel.attributedText = attrStr;
[myLabel sizeToFit];
[self.view addSubview:myLabel];
}
3)デバイスでコンパイルして実行します。 iOS 7のバージョンに応じて、テキストは表示されるか、表示されません。 UILabelの背景色はどちらの場合でも表示されます。
スクリーンショット
iPhone 5 with iOS 7.0(11A465)
iPhone 5 with iOS 7.0(11A4449d)
私の質問
誰かがこの問題をデバイスで再現できますか?
このバグの回避策を見つけました。 githubコードで回避策を使用するには、次のようにします。
NSAttributedString* attrStr =
[[NSAttributedString alloc] initWithString:@"Lorem ipsum dolor sit\n" // <---
attributes:
@{NSUnderlineStyleAttributeName:@(NSUnderlineStyleSingle),
NSParagraphStyleAttributeName:paragraph}];
UILabel* myLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 30, 0, 0)];
myLabel.backgroundColor = [UIColor greenColor];
myLabel.attributedText = attrStr;
[myLabel sizeToFit];
myLabel.numberOfLines = 2; // <---
2つの変更を加えました。元の文字列に改行文字を追加し、ラベルのnumberOfLines
を2に設定しました。
回避策は、ラベルのテキストをラベルの上部に押し付けることです。これで問題は解決したようです。言い換えると、このバグは、ラベルがテキストを垂直方向に中央揃えしようとしたために発生したようです。ラベルの高さnumberOfLines
と、テキストの最後の余分な改行文字を調整して、ラベルのサイズに対してテキストを意図的に長くしすぎると、属性付きの文字列が描画されます。
[〜#〜] edit [〜#〜]同じ行に沿って別の回避策を見つけました:テキストに合わせてラベル自体のサイズを変更します。ここに私のコードと説明を参照してください: https://stackoverflow.com/a/19545193/341994 そのコードでは、反対側から同じことをします:ラベルに固定幅の制約と柔軟な高さの制約、および独自の高さを設定することにより、ラベルはテキストの上部をそれ自体の上部に合わせるため、テキストを正しく表示できます。言い換えると、これはラベルがテキストを垂直方向に中央揃えしないようにするもう1つの方法であり、これがバグを引き起こしているようです。
さらに編集このバグはiOS 7.1で修正される可能性があると感じています。
UITableViewCellでUILabelのテキストに背景色を設定するときにも同じ問題が発生しました。私の回避策は、セルでUILabelの代わりにUserInteractionを無効にしてUITextViewを使用することでしたが、機能しました。
更新:この問題は、基本的なUITableViewCellに含まれているUILabelでのみ発生することがわかりました。
pdate 2: UILabelが複数行のテキストに折り返されても問題が発生しないこともわかりました。回避策の1つは、改行とスペースを追加してテキストを強制的に折り返すことです。非常にハッキーですが、動作します。 numberOfLinesがゼロに設定され、lineBreakModeがNSLineBreakByWordWrappingに設定されていることを確認してください。
私のアプリケーションでも同じ問題がありました。シミュレーターと私のデバイス(7.0.2を実行しているiPhone 5(11A501))で発生していました。その後、他のViewControllerにあるUILabelsがNSUnderlineStyleSingle属性を適切に使用してNSAttributedStringsを表示していることに気付きました。
いくつかのトラブルシューティングの後。デフォルトのフォント(私はSystem 17.0を使用しています)を使用していて、UILabelの高さが62ピクセル未満の場合、使用している背景色、テキストの色、配置に関係なく正しく表示されるようです。 UILabelの高さを61ピクセルを超える値に変更すると、自動サイズ調整で高さが変更されます。フォントをカスタムに変更すると、下線付きのNSAttributedTextが消えます。
最初、この問題はUILabelを新しいステータスバーの背後に配置した(またはその欠如)が原因であると考えましたが、この新しい機能と相互作用する位置でも、高さのルールは保持されています。 UILabelの高さがそのような問題を引き起こすとは信じがたいのですが、その結論に至りました。
うわー、これを見つけるのにしばらく時間がかかりました。私はインディと同様の問題を抱えているようです。属性付き文字列の背景色を設定すると、テキストが表示されなくなりました。これを再現できるのは、iOS 7.0.3を実行しているデバイス上だけです。
CGRect rect = self.frame;
CGRect rr = [attribText boundingRectWithSize:rect.size options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesDeviceMetrics context:nil];
UIGraphicsBeginImageContextWithOptions(rr.size, NO, 0.);
[attribText drawWithRect:rr options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesDeviceMetrics context:nil];
UIImage* image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageView *imView = [[UIImageView alloc]initWithImage:image];
[self addSubview:imView];
私もこの問題を抱えていて、特定の言語とiOS 7.0でのみ現れるようになっています。中国語でテキストに下線を付けたいときにこの問題が発生しました[label sizeToFit]で問題を解決しました役立ちます ;)
コンスタンティン。
私はこの問題が同様の方法で発生していることに気づきましたが、最終的には別の解決策になりました。文字列はときどき消えますが、上記の解決策はテキストが消えないようにするのに役立ちましたが、テキストは、設定した属性(取り消し線、異なる色など)なしで表示されることがよくありました。
ここに設定があります:
Xcode 6.1.1とiOS SDK 8.1を使用してビルドされたSpringsとStrutsを使用したレガシープロジェクト。この問題は、iPhoneデバイスと比較してiPadデバイスでより顕著でした(iPhoneでの時間の約5%対iPadでの95%)。 numberOfLines
、sizeToFit
、またはその他の方法を使用したかどうかに関係なく、属性はiPadまたはiPhoneで100%正しく表示されませんでした。
解決策は、自動レイアウトに切り替えて、上記の解決策を採用することでした(numberOfLines = 2
、sizeToFit
は私の状況ではオプションのようでした)
SpringsとStrutsのUILabels
の属性付きテキストが水平方向に引き伸ばされると、バグが発生するようです。
これが誰かを助けることを願っています!