iOS / UIFont – уменьшение ширины шрифта

У меня есть UILabel который является фиксированным размером. К сожалению, в редких случаях текст, который мне нужно вписаться в него, не подходит! Я попытался уменьшить размер шрифта, но он должен уменьшить настолько, что выглядит ужасно.

Можно ли как-то изменить ширину шрифта? У UIFont, похоже, нет никаких свойств, чтобы позволить мне это сделать? Нужно ли использовать UIWebView и использовать CSS? Я не знаю много CSS, поэтому любая помощь очень ценится, если это лучший способ решить эту проблему.

Альтернативно, любые другие способы решить эту проблему?

Благодарю Крейга

Самый простой способ уменьшить ширину текста – применить преобразование к слою метки:

 label.layer.transform = CATransform3DMakeScale(desiredWidth/textWidth, 1.0, 1.0); 

Вы хотите, чтобы вы сжимали его горизонтально, сохраняя высоту? Это достижимо, примерно до 60% от обычной ширины. Кроме того, это выглядит ужасно.

Ниже приведен пример drawRect для подкласса UILabel, который при необходимости сжимается независимо на любой оси.

 // This drawRect for a UILabel subclass reproduces most common UILabel formatting, but does not do truncation, line breaks, or scaling to fit. // Instead, it identifies cases where the label text is too large on either axis, and shrinks along that axis. // For small adjustments, this can keep text readable. In extreme cases, it will create an ugly opaque block. - (void) drawRect:(CGRect)rect; { CGRect bounds = [self bounds]; NSString *text = [self text]; UIFont *font = [self font]; // Find the space needed for all the text. CGSize textSize = [text sizeWithFont:font]; // topLeft is the point from which the text will be drawn. It may have to move due to compensate for scaling, or due to the chosen alignment. CGPoint topLeft = bounds.origin; // Default to no scaling. CGFloat scaleX = 1.0; CGFloat scaleY = 1.0; // If the text is too wide for its space, reduce it. // Remove the second half of this AND statement to have text scale WIDER than normal to fill the space. Useless in most cases, but can be amusing. if ((textSize.width>0) && (bounds.size.width/textSize.width<1)) { scaleX = bounds.size.width/textSize.width; topLeft.x /= scaleX; } else { // Alignment only matters if the label text doesn't already fill the space available. switch ([self textAlignment]) { case UITextAlignmentLeft : { topLeft.x = bounds.origin.x; } break; case UITextAlignmentCenter : { topLeft.x = bounds.origin.x+(bounds.size.width-textSize.width)/2; } break; case UITextAlignmentRight : { topLeft.x = bounds.origin.x+bounds.size.width-textSize.width; } break; } } // Also adjust the height if necessary. if ((textSize.height>0) && (bounds.size.height/textSize.height<1)) { scaleY = bounds.size.height/textSize.height; topLeft.y /= scaleY; } else { // If the label does not fill the height, center it vertically. // A common feature request is for labels that do top or bottom alignment. If this is needed, add a property for vertical alignment, and obey it here. topLeft.y = bounds.origin.y+(bounds.size.height-textSize.height)/2; } // Having calculated the transformations needed, apply them here. // All drawing that follows will be scaled. CGContextRef context = UIGraphicsGetCurrentContext(); CGContextScaleCTM(context, scaleX, scaleY); // Begin drawing. // UILabels may have a shadow. if ([self shadowColor]) { [[self shadowColor] set]; CGPoint shadowTopLeft = CGPointMake(topLeft.x+[self shadowOffset].width/scaleX, topLeft.y+[self shadowOffset].height/scaleY); [text drawAtPoint:shadowTopLeft withFont:font]; } // The text color may change with highlighting. UIColor *currentTextColor; if ((![self isHighlighted]) || (![self highlightedTextColor])) currentTextColor = [self textColor]; else currentTextColor = [self highlightedTextColor]; // Finally, draw the regular text. if (currentTextColor) { [currentTextColor set]; [text drawAtPoint:topLeft withFont:font]; } } 

Вы можете установить minimum font size UILabel на меньшее значение и проверить Autoshrink чтобы он автоматически Autoshrink . Этот параметр доступен в Interface Builder.

Внутренняя реализация уменьшит кернинг, который представляет собой ширину пространства между символами. Однако он не может уменьшить ширину.

Это ваша лучшая ставка. Если вы все еще не удовлетворены результатами. Возможно, вам придется изменить свой дизайн.