我有一个附加功能,NSString
它会根据正在读入的文本自动调整 a的大小UILabel
(我有一个简单的应用程序显示引文,所以有些是几个词,有些是几个句子)。在该标签下方quote
,我还有一个author
标签,其中(奇怪的是)其中包含引用的作者。
我试图将该author
标签直接放置在标签下方quote
(如,它的y
坐标将是quote
标签的y
坐标加上quote
标签的height
。我看到的是两个标签之间放置了一些空间,这取决于报价的长度, 改变大小。较小的引号有更多的空间,而较长的引号有更少的空间。这是我所看到的快速图表:
请注意红色和蓝色框之间的差距(我已经使用它设置,layer.borderColor/borderWidth
以便我可以在应用程序中看到它们),报价越短越大。
如果有人可以筛选下面的代码并帮助我指出导致差异的确切原因,我将不胜感激。据我所知,author
标签应始终比quote
标签y + height
值低 35 像素。
只是为了确认:一切都在 Interface Builder 中正确连接,等等。引用的内容很好,其他一切正常,所以它已经连接,这不是问题。
澄清一下,我的问题是:为什么标签之间的间隙会根据引用的长度而变化,我怎样才能正确获得稳定的、可设置的 35 像素间隙?
这是我用来定位标签的代码:
// Fill and format Quote Details
_quoteLabel.text = [NSString stringWithFormat:@"\"%@\"", _selectedQuote.quote];
_authorLabel.text = _selectedQuote.author;
[_quoteLabel setFont: [UIFont fontWithName: kScriptFont size: 28.0f]];
[_authorLabel setFont: [UIFont fontWithName: kScriptFontAuthor size: 30.0f]];
// Automatically resize the label, then center it again.
[_quoteLabel sizeToFitMultipleLines];
[_quoteLabel setFrame: CGRectMake(11, 11, 298, _quoteLabel.frame.size.height)];
// Position the author label below the quote label, however high it is.
[_authorLabel setFrame: CGRectMake(11, 11 + _quoteLabel.frame.size.height + 35, _authorLabel.frame.size.width, _authorLabel.frame.size.height)];
这是我的自定义方法sizeToFitMultipleLines
:
- (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];
}
这是我的fontSizeWithFont:constrainedToSize:minimumFontSize:
方法:
- (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;
}