我正在开发一个聊天应用程序,其中我在气泡中显示文本,有时文本很小,有时文本很大,我必须计算文本宽度和高度来绘制我的标签,直到这里一切正常,没有问题。
现在我必须支持 url 链接、电子邮件检测等,为此我必须使用属性文本(我正在使用http://nimbuskit.info)。对于英语没有问题,但对于从右到左的语言会产生标签高度计算不正确的问题。
我在代码中尝试了很多东西并在互联网上搜索,但没有找到任何解决方案,因此为了追踪根本原因,我在 Xcode 中创建了一个单一视图项目,并在其界面构建器中创建了两个标签,第一个是属性标签,另一个是纯文本,请查看屏幕截图,属性文本的格式与纯文本不同。
它自己的 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”而终止应用程序,原因:“-[__NSCFType lineBreakMode]:无法识别的选择器发送到实例 0x71bc3d0”