Я использую следующие два метода (один из них относится к категории NSString
, а другой категории UILabel
), чтобы автоматически регулировать высоту метки на основе текста внутри нее. Он отлично работает для большинства, но он имеет некоторые непредсказуемые результаты. Я не совсем уверен, где эта проблема может возникнуть, и я надеюсь, что некоторые из вас прекрасные люди могут предложить руку помощи. Во-первых, здесь методы в вопросе:Автоматическая регулировка высоты UILabel
NSString Категория:
- (CGFloat) fontSizeWithFont: (UIFont *) font constrainedToSize: (CGSize) size minimumFontSize: (CGFloat) minimumFontSize
{
CGFloat fontSize = [font pointSize];
CGFloat height = [self sizeWithFont: font constrainedToSize: CGSizeMake(size.width, FLT_MAX) lineBreakMode: NSLineBreakByWordWrapping].height;
UIFont *newFont = font;
// Reduce font size while too large, break if no height (empty string)
while (height > size.height && height != 0 && fontSize > minimumFontSize) {
fontSize--;
newFont = [UIFont fontWithName: font.fontName size: fontSize];
height = [self sizeWithFont: newFont constrainedToSize: CGSizeMake(size.width, FLT_MAX) lineBreakMode: NSLineBreakByWordWrapping].height;
};
// Loop through words in string and resize to fit
for (NSString *word in [self componentsSeparatedByCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]]) {
CGFloat width = [word sizeWithFont: newFont].width;
while (width > size.width && width != 0 && fontSize > minimumFontSize) {
fontSize--;
newFont = [UIFont fontWithName: font.fontName size: fontSize];
width = [word sizeWithFont: newFont].width;
}
}
return fontSize;
}
UILabel Категория:
- (void) sizeToFitMultipleLines
{
if (self.adjustsFontSizeToFitWidth) {
CGFloat adjustedFontSize = [self.text fontSizeWithFont: self.font constrainedToSize: self.frame.size minimumFontSize: self.minimumScaleFactor];
self.font = [self.font fontWithSize: adjustedFontSize];
}
[self sizeToFit];
}
Проблема, которая происходит в том, что высота этикетки имеет пустое пространство сверху и снизу, и чем длиннее строка внутри него, тем больше пустое пространство. У одной метки линии может быть, возможно, 10 пикселей выше и ниже ее внутри фрейма метки, но строка из шести строк может иметь почти 100 пикселей. Я не могу отслеживать, где это дополнительное пространство исходит из вышеприведенных методов.
Во-вторых, ширина метки иногда регулируется там, где требуется только изменение высоты. Я предполагаю, что [self sizeToFit]
является причиной этой конкретной проблемы, но я не совсем уверен, так как высота остается неуправленной, если я удалю ее. EDIT: Я исправил эту проблему ширины, вручную переставив метку после ее размера, чтобы она соответствовала (ее координата X теперь составляет ширину экрана минус ширина метки, разделенная на 2).
Любые мысли? Если вам нужна дополнительная информация или код, пожалуйста, спросите. Я всегда устанавливаю шрифт, прежде чем я вызову метод [sizeToFitMultipleLines]
на соответствующих ярлыках, так что это не проблема.
Я использовал вариации этого, чтобы заставить его работать. Вопрос был фактически расстоянием между этим ярлыком и другим, а не меткой, установленной неверно. – Luke