Eason
Eason

Reputation: 21

auto height for uilabel( alignment exception ) in tablecell by NSMutableParagraphStyle

crash after tableview reload

this problem only happen on iOS6, iOS7 is fine.

exception description:

NSTextAlignmentJustified and NSTextAlignmentNatural are invalid alignment values when drawing an NSString (null) (
0 CoreFoundation 0x00aa702e exceptionPreprocess + 206
1 libobjc.A.dylib 0x03152e7e objc_exception_throw + 44
2 CoreFoundation 0x00aa6deb +[NSException raise:format:] + 139
3 UIKit 0x022ea8ec -[NSString(UIStringDrawing) _drawInRect:withFont:lineBreakMode:alignment:lineSpacing:includeEmoji:truncationRect:] + 88
4 UIKit 0x022ea88f -[NSString(UIStringDrawing) drawInRect:withFont:lineBreakMode:alignment:lineSpacing:includeEmoji:] + 99
5 UIKit 0x022ea827 -[NSString(UIStringDrawing) drawInRect:withFont:lineBreakMode:alignment:lineSpacing:] + 91
6 UIKit 0x0241ce73 -[UILabel _legacy_drawTextInRect:baselineCalculationOnly:] + 3433
7 UIKit 0x0241cf76 -[UILabel _drawTextInRect:baselineCalculationOnly:] + 160
8 UIKit 0x0241bcd9 -[UILabel drawTextInRect:] + 548
9 UIKit 0x0241e098 -[UILabel drawRect:] + 98
10 UIKit 0x0230fe6e -[UIView(CALayerDelegate) drawLayer:inContext:] + 504
11 QuartzCore 0x0340ba3f -[CALayer drawInContext:] + 128
12 QuartzCore 0x0340b96b _ZL16backing_callbackP9CGContextPv + 96
13 QuartzCore 0x0331d723 CABackingStoreUpdate_ + 2703
14 QuartzCore 0x0340b83c _ZN2CA5Layer8display_Ev + 1406
15 QuartzCore 0x0340b9ba -[CALayer _display] + 33
16 QuartzCore 0x0340b2b6 _ZN2CA5Layer7displayEv + 152
17 QuartzCore 0x0340b994 -[CALayer display] + 33
18 QuartzCore 0x034000e2 _ZN2CA5Layer17display_if_neededEPNS_11TransactionE + 328
19 QuartzCore 0x0340015c _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 38
20 QuartzCore 0x0337e0bc _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 324
21 QuartzCore 0x0337f227 _ZN2CA11Transaction6commitEv + 395
22 QuartzCore 0x0337f8e2 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 96
23 CoreFoundation 0x00a6fafe __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION
+ 30
24 CoreFoundation 0x00a6fa3d __CFRunLoopDoObservers + 381
25 CoreFoundation 0x00a4d7c2 __CFRunLoopRun + 1106
26 CoreFoundation 0x00a4cf44 CFRunLoopRunSpecific + 276
27 CoreFoundation 0x00a4ce1b CFRunLoopRunInMode + 123
28 GraphicsServices 0x044bc7e3 GSEventRunModal + 88
29 GraphicsServices 0x044bc668 GSEventRun + 104
30 UIKit 0x022bfffc UIApplicationMain + 1211
31 DirectSeller 0x0000548d main + 141
32 libdyld.dylib 0x03a2470d start + 1 )

I never set alignment to "NSTextAlignmentJustified" or "NSTextAlignmentNatural".i can't understand.

auto height code:

DSBasicInfoPrototypeCell *cell = [tableView dequeueReusableCellWithIdentifier:@"BasicCell"]; NSString *titleText = data[@"title"];

    NSMutableAttributedString *titleAttributedText = [[NSMutableAttributedString alloc] initWithString:titleText];
    NSMutableParagraphStyle *titleParagraphStyle = [[NSMutableParagraphStyle alloc] init];
    [titleParagraphStyle setLineSpacing:3.0f];
    titleParagraphStyle.alignment = NSTextAlignmentLeft;
    [titleAttributedText addAttribute:NSParagraphStyleAttributeName value:titleParagraphStyle range:NSMakeRange(0, titleText.length)];
    cell.titleLabel.attributedText = titleAttributedText;

    cell.titleLabel.preferredMaxLayoutWidth = 280;
    [cell.titleLabel setText:data[@"title"]];
    [cell.leftSubtitleLabel setText:data[@"source"]];
    [cell.rightSubtitleLabel setText:data[@"time"]];

    [cell setNeedsUpdateConstraints];
    [cell updateConstraintsIfNeeded];
    [cell.contentView setNeedsLayout];
    [cell.contentView layoutIfNeeded];

    return [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;

finally,to apologize for my bad english.

Upvotes: 2

Views: 668

Answers (2)

Juan Fran Jimenez
Juan Fran Jimenez

Reputation: 1649

I've managed to work around this issue on iOS6 by specifying a text alignment for the paragraph (not leaving it to default):

paragraphStyle.alignment = NSTextAlignmentLeft;

Hope it works for you too.

Upvotes: 1

Scott Allen
Scott Allen

Reputation: 1189

I had the same exact problem, and I was unable to find the root cause. I believe it is related to using the ParagraphStyle in the attributed text.

My workaround was to check the OS version, and if it was less than version 7.0, I would use standard text instead of AttributedText.

Not the best solution, but it at least got my app to stop crashing on iOS6.1 until I find a better solution.

    NSString* text = @"Text\nText";

    NSString *ver   = [[UIDevice currentDevice] systemVersion];
    float ver_float = [ver floatValue];
    if (ver_float >= 7.0)
    {            
        NSMutableAttributedString* attributedText = [[NSMutableAttributedString alloc] initWithString:text];
        NSMutableParagraphStyle* paragraphStyle   = [[NSMutableParagraphStyle alloc] init];
        paragraphStyle.paragraphSpacing           = 6.0f;
        [attributedText addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, text.length)];

        [self.descLabel setAttributedText:attributedText];
    }
    else
    {            
        [self.descLabel setText:@"text"];
    }

Upvotes: 0

Related Questions