I know this should be very simple, but I've been really struggling with creating a UILabel programmatically and getting it to behave the way I would like.
All I want is to be able to create a label, set the maximum attributes as far as height, width and font size, and then have the text get smaller AND/OR just truncate the text to accommodate long strings of text.
Let's say that I want my label to have text that has a maximum width of 380, a maximum height of 20 and a maximum font size of 12.
So here is what I have attempted to do to create such a label:
UILabel *fromLabel = [[UILabel alloc]initWithFrame:CGRectMake(91, 15, 0, 0)]; fromLabel.text = [self fromSender]; fromLabel.font = [UIFont fontWithName:ProximaNovaSemibold size:12]; //custom font fromLabel.numberOfLines = 1; fromLabel.baselineAdjustment = YES; fromLabel.adjustsFontSizeToFitWidth = YES; fromLabel.adjustsLetterSpacingToFitWidth = YES; fromLabel.size = [fromLabel.text sizeWithFont:fromLabel.font constrainedToSize:CGSizeMake(380, 20) lineBreakMode:NSLineBreakByTruncatingTail]; fromLabel.minimumScaleFactor = MIN_SCALE_FACTOR; fromLabel.clipsToBounds = YES; fromLabel.backgroundColor = [UIColor clearColor]; fromLabel.textColor = [UIColor blackColor]; fromLabel.textAlignment = NSTextAlignmentLeft; [collapsedViewContainer addSubview:fromLabel];
Ok, so the label appears, but the text is larger than 12 and the height always comes out to be 21!? Even if I change the height and text size values to extreme sizes, this code creates a label of some fixed size that can't be adjusted. The only thing I can seem to make smaller is the width.
I must be over looking something basic, but I really can't figure out how to get my desired result, nor do I understand why I'm getting the behavior that I am getting.
A view that displays one or more lines of informational text.
In this field you can search for "Label" and "Button". When you have what you want, click and drag it to your storyboard.
Does the following work ?
UIFont * customFont = [UIFont fontWithName:ProximaNovaSemibold size:12]; //custom font NSString * text = [self fromSender]; CGSize labelSize = [text sizeWithFont:customFont constrainedToSize:CGSizeMake(380, 20) lineBreakMode:NSLineBreakByTruncatingTail]; UILabel *fromLabel = [[UILabel alloc]initWithFrame:CGRectMake(91, 15, labelSize.width, labelSize.height)]; fromLabel.text = text; fromLabel.font = customFont; fromLabel.numberOfLines = 1; fromLabel.baselineAdjustment = UIBaselineAdjustmentAlignBaselines; // or UIBaselineAdjustmentAlignCenters, or UIBaselineAdjustmentNone fromLabel.adjustsFontSizeToFitWidth = YES; fromLabel.adjustsLetterSpacingToFitWidth = YES; fromLabel.minimumScaleFactor = 10.0f/12.0f; fromLabel.clipsToBounds = YES; fromLabel.backgroundColor = [UIColor clearColor]; fromLabel.textColor = [UIColor blackColor]; fromLabel.textAlignment = NSTextAlignmentLeft; [collapsedViewContainer addSubview:fromLabel];
edit : I believe you may encounter a problem using both adjustsFontSizeToFitWidth
and minimumScaleFactor
. The former states that you also needs to set a minimumFontWidth
(otherwhise it may shrink to something quite unreadable according to my test), but this is deprecated and replaced by the later.
edit 2 : Nevermind, outdated documentation. adjustsFontSizeToFitWidth
needs minimumScaleFactor
, just be sure no to pass it 0 as a minimumScaleFactor (integer division, 10/12 return 0). Small change on the baselineAdjustment
value too.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With