uilabel正在切断从右到左语言的归属文本中的文本

时间:2013-02-21 06:53:35

标签: ios objective-c uilabel

我正在开发一个聊天应用程序,其中我在气泡中显示文本,有时文本很小,有时文本很大,我必须计算文本宽度和放大倍数。绘制我的标签的高度,直到这里一切正常,没有问题。

现在我必须支持网址链接,电子邮件检测等,为此我必须使用属性文本(我正在使用http://nimbuskit.info)。对于英语而言,没有问题,但是从右到左的语言会产生标签高度无法正确计算的问题。

我在代码中尝试了很多东西并在互联网上搜索但没有找到任何解决方案,因此为了追踪根本原因,我在Xcode中创建了一个单一的视图项目,并在其界面构建器中创建了两个标签1st并且另一个是纯文本,请查看屏幕截图,属性文本的格式与纯文本不同。

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小时后,我仍在寻找解决方案..我找到了this,但这并没有完全解决问题。请查看链接。

6小时后,另一个问题我忘记提及aStr.size.widthaStr.size.height导致应用崩溃,从而导致此错误:

  

- [__ NSCFType lineBreakMode]:无法识别的选择器发送到实例0x71bc3d0   ***由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [__ NSCFType lineBreakMode]:   无法识别的选择器发送到实例0x71bc3d0'

enter image description here

0 个答案:

没有答案