MBProgressHUD to show label text in more than one line

后端 未结 4 1795
情深已故
情深已故 2021-02-05 09:03

Hi i have a MBProgressHUD on my iPad screen. Works perfectly fine. But i want to change the label to show in three lines.Like this

    self.hud =  [[MBProgressHU         


        
4条回答
  •  时光说笑
    2021-02-05 09:26

    The reason why labelText differs from detailsText, I imagine because it's meant to be a very similar to UIAlertView from the title/description perspective.

    The differences between the two labels is quite distinct because of their purpose, for instance:

    • Titles have bigger fonts, oft times bold in comparison to detail text.
    • Titles are meant to be short and obvious, taken from a popular dictionary site (description speaks for itself):

    Title: A descriptive name; an epithet.

    I'd recommend not having a multi-line title, keeping it short, and using the description text.

    The reason why multi-line titles do not work is because of the layoutSubviews implementation, the size is not being calculated. if you inspect MBProgressHud.m, within layoutSubviews,

    CGFloat remainingHeight = bounds.size.height - totalSize.height - kPadding - 4 * margin; 
    CGSize maxSize = CGSizeMake(maxWidth, remainingHeight);
    CGSize detailsLabelSize = [detailsLabel.text sizeWithFont:detailsLabel.font 
                                constrainedToSize:maxSize lineBreakMode:detailsLabel.lineBreakMode];
    totalSize.width = MAX(totalSize.width, detailsLabelSize.width);
    totalSize.height += detailsLabelSize.height;
    if (detailsLabelSize.height > 0.f && (indicatorF.size.height > 0.f || labelSize.height > 0.f)) {
        totalSize.height += kPadding;
    }
    

    Note the -[NSString sizeWithFont: constrainedToSize: lineBreakMode:] call for the description text; this method calculates the size required to display the text - using as many lines as necessary, whereas the -[NSString sizeWithFont:] calculates the size required to display the text, but only up to displaying one line.

    I would advise against having a multi-line title, and instead provide a shorter title, with some description text to accompany it.

    If you simply must have the multi-line title (all changes within MBProgressHud.m):

    - (void)setupLabels {
    label = [[UILabel alloc] initWithFrame:self.bounds];
    label.adjustsFontSizeToFitWidth = NO;
    label.textAlignment = MBLabelAlignmentCenter;
    label.opaque = NO;
    label.backgroundColor = [UIColor clearColor];
    label.textColor = [UIColor whiteColor];
    label.font = self.labelFont;
    label.text = self.labelText;
    >>> label.numberOfLines = 0;
    [self addSubview:label];  
        ...
    

    Replace:

    CGSize labelSize = [label.text sizeWithFont:label.font];
    labelSize.width = MIN(labelSize.width, maxWidth);
    totalSize.width = MAX(totalSize.width, labelSize.width);
    totalSize.height += labelSize.height;
    if (labelSize.height > 0.f && indicatorF.size.height > 0.f) {
        totalSize.height += kPadding;
    }
    
    CGFloat remainingHeight = bounds.size.height - totalSize.height - kPadding - 4 * margin; 
    CGSize maxSize = CGSizeMake(maxWidth, remainingHeight);
    CGSize detailsLabelSize = [detailsLabel.text sizeWithFont:detailsLabel.font 
                                constrainedToSize:maxSize lineBreakMode:detailsLabel.lineBreakMode];
    

    With:

    CGFloat remainingHeight = bounds.size.height - totalSize.height - kPadding - 4 * margin;  
    CGSize maxSize = CGSizeMake(maxWidth, remainingHeight);  
    
    CGSize labelSize = [label.text sizeWithFont:label.font constrainedToSize:maxSize lineBreakMode:label.lineBreakMode];
    totalSize.width = MAX(totalSize.width, labelSize.width);
    totalSize.height += labelSize.height;
    
    if (labelSize.height > 0.f && indicatorF.size.height > 0.f) {
        totalSize.height += kPadding;
    }
    
    remainingHeight = bounds.size.height - totalSize.height - kPadding - 4 * margin;  
    CGSize detailsLabelSize = [detailsLabel.text sizeWithFont:detailsLabel.font 
                                constrainedToSize:maxSize lineBreakMode:detailsLabel.lineBreakMode];
    

    Hope this isn't too late to help.

提交回复
热议问题