テキストをバブルで表示しているチャットアプリに取り組んでいます。テキストが小さい場合もあれば、テキストが大きい場合もあり、ラベルを描画するためにテキストの幅と高さを計算する必要があります。ここまでは問題ありません。
今、私はURLリンク、電子メール検出などをサポートする必要があります. 英語では問題ありませんが、右から左への言語では、ラベルの高さが正しく計算されないという問題が生じます。
コードで多くのことを試し、インターネットで検索しましたが、解決策が見つかりませんでした。そのため、根本原因を追跡するために、Xcode で単一のビュー プロジェクトを作成し、そのインターフェイス ビルダーで 2 つのラベルを作成しました。スクリーンショットをご覧ください。属性付きテキストは、プレーン テキストとは異なる形式になっています。
xcode インターフェイス ビルダー自体がこの問題を引き起こしています。
これらのラベルの幅 (220) と高さ (608) は、実際のコードを実行して設定されます。コードを表示してください。
-(NIAttributedLabel*)lbl
{
NSString *text = @"وأضاف لافروف نبذل ما في وسعنا لتهيئة الظروف لبدء هذا الحوار في أسرع وقت بدون شروط مسبقة طبقا للاتفاقات المنصوص عليها في بيان جنيف التي يعمل مبعوث جامعتكم والأمم المتحدة الأخضر الإبراهيمي على تحقيقها. وحول الوضع في الشرق الأوسط قال لافروف إن موسكو ليست راضية عن الوضع القائم في المنطقة، نظرا إلى عدد من الأمور التي تثير قلقنا وقلقكم. وأوضح أنه يقصد ظهور بؤر للنزاعات المسلحة في المنطقة، وتنامي ظاهرة التطرف والإرهاب، وانتشار الأسلحة دون حسيب أو رقيب. وحث لافروف الجامعة على أن تؤدي دورا رئيسيا في حل النزاعات الدائرة في العالم العربي بعيدا عن أي تدخل خارجي لا يوافق عليه مجلس الأمن الدولي. وحول النزاع الفلسطيني الإسرائيلي شدد لافروف على ضرورة تكثيف جهود الوسطاء الدوليين والجامعة العربية لإنهائه. وأكد لافروف على أن روسيا تؤيد قرار الجامعة العربية بشأن عقد مؤتمر يتبنى إعلان إقامة منطقة خالية من أسلحة الدمار الشامل في الشرق الأوسط، مشيرا إلى أن روسيا ستعمل على تنفيذ هذا القرار. وكان منتدى التعاون الروسي العربي قد أسس في ديسمبر/كانون الأول من عام 2009. وحُددت مهمته في الارتقاء بمستوى التعاون بين روسيا وأعضاء جامعة الدول العربية. ولم يتمكن المنتدى من عقد أي اجتماع حتى الآن بسبب أحداث العالم العربي التي أعقبت صدور إعلان تأسيسه......";
UIFont *font = [UIFont fontWithName:@"Helvetica" size:15.0];
NIAttributedLabel* label = [[NIAttributedLabel alloc] initWithFrame:CGRectZero];
label.text = text;
label.numberOfLines = 0;
label.lineBreakMode = NSLineBreakByWordWrapping;
label.attributesForHighlightedLink = [NSDictionary dictionaryWithObject:(id)RGBCOLOR(255, 0, 0).CGColor forKey:(NSString *)kCTForegroundColorAttributeName];
label.delegate = self;
label.autoDetectLinks = YES;
label.linksHaveUnderlines = YES;
label.font = font;
label.backgroundColor = [UIColor orangeColor];
[label sizeToFit];
[label setTextAlignment:NSTextAlignmentRight];
NSMutableAttributedString *aStr = [[NSMutableAttributedString alloc]initWithAttributedString:[label attributedText]]; // trying to get width height of attributed text
CGSize size = [aStr.string sizeWithFont:font constrainedToSize:CGSizeMake(220, FLT_MAX) lineBreakMode:NSLineBreakByWordWrapping];
label.frame = CGRectMake(0, 0, size.width, size.height);
NSLog(@"SIZE=> %0.f-%0.f | %0.f-%0.f",size.width, size.height, label.frame.size.width, label.frame.size.height);
return label;
}
この問題を解決するには?属性付きテキストの幅と高さを計算する必要がありますか? NSMutableAttributedString には sizeWithFont:constrainedToSize:lineBreakMode がありません ...
助けてください。
この質問を 5 時間投稿した後、私はまだ解決策を探しています..これを見つけましたが、問題は完全には解決しませんでした。リンクをご覧ください。
6時間後、私が言及するのを忘れた別の問題aStr.size.width
またはaStr.size.height
アプリのクラッシュを引き起こし、このエラーが発生しました:
-[__NSCFType lineBreakMode]: 認識されないセレクターがインスタンス 0x71bc3d0 に送信されました *** キャッチされない例外 'NSInvalidArgumentException' によりアプリを終了します。