Given a UILabel and a NSString, how do I determine how much of the string can fit inside the UILabel? I am using Xcode-5 and iOS-7.
I have been trying to see what I can extract from the thread Calculating UILabel Text Size but I am not getting anywhere with the responses there.
If you have a UITextField or UITextView and want to stop users typing in more than a certain number of letters, you need to set yourself as the delegate for the control then implement either shouldChangeCharactersIn (for text fields) or shouldChangeTextIn (for text views).
A view that displays one or more lines of informational text.
Label is a user interface item in SwiftUI which enables you to display a combination of an image (icon, SF Symbol or other) and a text label in a single UI element.
Well, what I did here works though there may be another, more efficient (yet less straight-forward) way.
What I did was just calculate the size of the rect needed for the text, see if it fits in the label's frame, and if not, chop off a character and try again.
@interface LTViewController ()
@property (nonatomic, weak) IBOutlet UILabel *label1;
@property (nonatomic, weak) IBOutlet UILabel *label2;
@end
@implementation LTViewController
- (void)viewDidLoad
{
[super viewDidLoad];
UILabel *label1 = self.label1;
UILabel *label2 = self.label2;
UIFont *font = label1.font;
NSString *text = @"This is some text that will go into labels 1 and 2.";
CGRect label1Frame = label1.frame;
NSUInteger numberOfCharsInLabel1 = NSNotFound;
for (int i = [text length]; i >= 0; i--) {
NSString *substring = [text substringToIndex:i];
NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:substring
attributes:@{ NSFontAttributeName : font }];
CGSize size = CGSizeMake(label1Frame.size.width, CGFLOAT_MAX);
CGRect textFrame = [attributedText boundingRectWithSize:size
options:NSStringDrawingUsesLineFragmentOrigin
context:nil];
if (CGRectGetHeight(textFrame) <= CGRectGetHeight(label1Frame)) {
numberOfCharsInLabel1 = i;
break;
}
}
if (numberOfCharsInLabel1 == NSNotFound) {
// TODO: Handle this case.
}
label1.text = [text substringToIndex:numberOfCharsInLabel1];
label2.text = [text substringWithRange:NSMakeRange(numberOfCharsInLabel1, [text length] - numberOfCharsInLabel1)];
}
@end
This yields:
It's up to you to handle the error conditions. For example, the rest doesn't completely fit into label2 and it's probably going to chop in the middle of a word more often then not.
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