gpt4 book ai didi

ios - 将一个 UILabel 直接定位在另一个 UILabel 的下方

转载 作者:可可西里 更新时间:2023-11-01 05:56:06 27 4
gpt4 key购买 nike

我有一个 NSString 的附加功能,它会根据正在读入的文本自动调整 UILabel 的大小(我有一个简单的应用程序显示引号,所以有些是几句话,一些几句话)。在 quote 标签下方,我还有一个 author 标签,(奇怪的是)其中包含引文的作者。

我试图将 author 标签直接放在 quote 标签下方(例如,它的 y 坐标将是 quote 标签的 y 坐标加上 quote 标签的 height。我看到的是两个标签之间放置了一些空间,这取决于报价的长度,会改变大小。较小的报价有更多的空间,而较长的报价有较少的空间。这是我所看到的快速图表:

enter image description here enter image description here

请注意红色和蓝色框之间的间隙(我使用 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;
}

最佳答案

在调用 size 以适合两个标签后,计算它们的框架之间的距离并相应地更改它们:

[quoteLabel sizeToFit];
[authorLabel sizeToFit];

float distance = authorLabel.frame.origin.y - quoteLabel.frame.size.height;
float difference = distance - 35;

authorLabel.frame = CGRectMake(authorLabel.frame.origin.x,(authorLabel.frame.origin.y - difference),authorLabel.frame.size.width,authorLabel.frame.size.height);

间隙变化的原因是引用标签框架在您调用 sizeToFit 时会根据其内容更改其高度。

更新

鉴于评论中最近的发展,我认为您有 3 种可能性:

  • 调整空格的大小而不仅仅是单词,这样字符串实际上正确地适合框架
  • 以某种方式访问​​ UILabel 的 CTFramesetter 以查看实际的内容框架,总而言之,相当于
  • 制作你自己的 UIView 子类来处理 Core Text 绘图draw rect 方法(在你的情况下应该很容易),因为毕竟你试图给 UILabel 一个不适合的行为

关于ios - 将一个 UILabel 直接定位在另一个 UILabel 的下方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15808069/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com