Как рассчитать высоту текстового прямоугольника из NSString? - PullRequest
6 голосов
/ 23 апреля 2010

Я знаю, что есть этот:

sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode:

Но так как CGSize всегда имеет одинаковую высоту и не приспосабливается к какому-либо сжатому тексту или чему-либо еще, CGSize не сообщает, какова высота текста.

Пример. Создайте UILabel с 320 x 55 точками и поместите туда текст «ооооооооооооооо». Пусть ярлык сжимает текст вниз. Сюрприз: CGSize.height остается такой же высоты, даже если текст настолько мал, что вам нужен микроскоп.

Хорошо, так что после того, как я ударился головой о моего MacBook Pro, который сейчас наполовину сломан, единственная мысль, которая может помочь, - это противный фактический размер шрифта. Но размер шрифта в пика, я думаю, это не совсем то, что вы получаете на экране, не так ли?

Когда этот размер шрифта равен 10, мой текст на самом деле максимум на 10 пунктов? Время от времени я пытался сделать именно это, и как только в тексте появился символ «ay» или какой-либо символ, который простирается до уровня ниже (как это делает хвост «y»), он выходит за границы, и весь текст превышает 10 пунктов.

Итак, как бы вы вычислили реальную высоту текста для однострочной маркировки без длинной бороды и опыта работы в больнице?

Ответы [ 5 ]

3 голосов
/ 24 декабря 2013

Важно: Начиная с iOS 7.0, следующий метод устарел.

sizeWithFont: minFontSize: actualFontSize: forWidth: lineBreakMode:

Используйте приведенный ниже код

CGRect frame = [cellText boundingRectWithSize:CGSizeMake(568,320) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:32.0f]} context:nil];
float height = frame.size.height;
3 голосов
/ 23 апреля 2010

Попробуйте этот код:

CGSize maximumSize = CGSizeMake(300, 9999);
NSString *myString = @"This is a long string which wraps";
UIFont *myFont = [UIFont fontWithName:@"Helvetica" size:14];
CGSize myStringSize = [myString sizeWithFont:myFont 
    constrainedToSize:maximumSize 
    lineBreakMode:self.myLabel.lineBreakMode];

из моего ответа здесь

Он использует другой метод и устанавливает очень высокий CGSize в начале (который затем сокращается, чтобы соответствовать строке)

2 голосов
/ 23 апреля 2010

Похоже, что после того, как вы получите фактический размер шрифта от вызова этой функции, вам нужно снова вызвать этот новый размер:

NSString* yourString = @"SomeString";
float actualSize;
[yourString sizeWithFont:yourFont 
             minFontSize:minSize 
          actualFontSize:&actualSize 
                forWidth:rectWidth 
           lineBreakMode:breakMode];

CGSize size = [yourString sizeWithFont:[UIFont fontWithName:fontName size:actualSize]];
1 голос
/ 23 апреля 2010

Также вы установили label.numberOfLines = 0;?

0 голосов
/ 03 декабря 2016

После запуска этого кода frame.size будет иметь высоту и ширину вашей nsstring точно ..

NSString *text = @"This is my Mac";
textFont = [NSFont fontWithName:@"HelveticaNeue-Medium" size: 80.f];
textColor = [NSColor yellowColor];
NSDictionary *attribs = @{ NSForegroundColorAttributeName:textColor,
                           NSFontAttributeName: textFont };
CGRect frame = [text boundingRectWithSize:CGSizeMake(0,0) options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesDeviceMetrics attributes:attribs context:nil];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...