27

先週、NSAttributedString が表示されないというシミュレーターのバグについて質問しました: iOS 7 シミュレーターのバグ - NSAttributedString が表示されない

残念ながら、これはシミュレーターのバグではなく、iOS 7 のバグのようです。iPhone 5 デバイスでこの問題を再現しました。

このバグは、NSUnderlineStyleAttributeName と NSParagraphStyleAttributeName を NSAttributedString の属性として使用する組み合わせのようです。

これまでに 2 台の iOS 7 デバイスでのみテストしましたが、問題が発生したのはそのうちの 1 台だけです。両方がまったく同じバージョンにアップグレードされた後でも:

  • iOS 7.0 を搭載した最初の iPhone 5 (11A465): テキストが表示されない

  • 7.0.2 (11A501) にアップグレードした後の最初の iPhone 5: テキストが表示されない

  • iOS 7.0 を実行する 2 番目の iPhone 5 (11A4449d): テキストが正しく表示される

  • 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 で、新しい「Single View Application」を作成します。何とでも呼んでください。

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 の背景色が表示されます。

スクリーンショット

iOS 7.0 を搭載した iPhone 5 (11A465)

iOS 7.0 を搭載した iPhone 5 (11A465)

iOS 7.0 を搭載した iPhone 5 (11A4449d)

iOS 7.0 を搭載した iPhone 5 (11A4449d)

私の質問

デバイスでこの問題を再現できる人はいますか?

4

7 に答える 7

3

アプリケーションで同じ問題が発生しました。それは、私のデバイス (7.0.2 (11A501) を実行している iPhone 5) だけでなく、シミュレーターでも発生していました。次に、他の ViewControllers にある UILabels が NSUnderlineStyleSingle 属性を適切に使用して NSAttributedStrings を表示していることに気付きました。

いくつかのトラブルシューティングの後。デフォルトのフォント (私は System 17.0 を使用しています) を使用していて、UILabel の高さが 62 ピクセル未満の場合、使用している背景色、テキストの色、配置に関係なく正しく表示されるようです。UILabel の高さを 61 ピクセルを超える値に変更して、自動サイズ変更で高さを変更したり、フォントをカスタムに変更したりすると、下線付きの NSAttributedText が消えます。

最初は、この問題は UILabel を新しいステータス バーの後ろに配置した (またはステータス バーがない) ことが原因ではないかと考えていましたが、この新しい機能と相互作用する位置でも、高さの規則は保持されていました。UILabel の高さがこのような問題を引き起こすとは信じがたいですが、それが私がたどり着いた結論です。

于 2013-10-10T13:57:05.903 に答える
1

回避策: イメージ ビューを使用する

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];
于 2013-10-22T10:44:06.123 に答える
0

この問題が同様の方法で発生していることに気付きましたが、最終的には別の解決策になりました。文字列が消えることがありましたが、上記の解決策はテキストが消えないようにするのに役立ちましたが、設定した属性 (取り消し線、異なる色など) なしでテキストが表示されることがよくありました。

セットアップは次のとおりです。

Xcode 6.1.1 と iOS SDK 8.1 を使用してビルドされたスプリングとストラットを使用するレガシー プロジェクト。この問題は、iPhone デバイスと比較して iPad デバイスでより顕著でした (iPhone では約 5%、iPad では 95%)。numberOfLinesを使用したか、他の方法を使用したかに関係なくsizeToFit、属性は 100% の確率で iPad または iPhone に正しく表示されませんでした。

解決策は、自動レイアウトに切り替えて上記の解決策を採用することでした(numberOfLines = 2sizeToFit私の状況ではオプションのようでした)

UILabelsSprings と Struts が水平方向に引き伸ばされると、Attributed Text にバグがあるようです。

これが誰かを助けることを願っています!

于 2015-01-09T14:15:56.063 に答える