ios – 将UILabel直接放置在另一个UILabel下面

我有一个NSString的补充,根据正在读入的文本自动调整UILabel的大小(我有一个简单的应用程序显示引用,所以有些是几个单词,有些是一些句子).在该引号标签下面,我还有一个作者标签,​​其中(奇怪的是)有引用的作者.

我试图将作者标签直接放在引号标签下面(因为,它的y坐标是引号标签的y坐标加上引号标签的高度.我看到的是两个标签之间放置了一些空间,取决于引用的长度,更改大小.较小的引号具有更多的空间,而较长的引号具有较小的空间.这是我所看到的快速图表:

注意红色和蓝色框之间的差距(我使用layer.borderColor / borderWidth设置,所以我可以在应用程序中看到它们),报价越短越大.

如果任何人都可以筛选下面的代码并帮助指出我究竟是什么导致了这种差异,我将非常感激.从我所看到的,作者标签应始终在引号标签的y高度值下方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;
}

最佳答案 在调整大小以适合两个标签后,计算其帧之间的距离并相应地更改它们:

[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时,引用标签框架会根据其内容更改其高度.

UPDATE

鉴于评论最近的发展,我认为你有三种可能性:

>调整空白大小而不是仅调整单词,以便调整字符串
实际上正确地适合框架
>以某种方式访问​​UILabel的CTFramesetter以查看实际情况
框架,当所有的说完成时,相当于
>创建自己的UIView子类,在其中处理Core Text绘图
绘制rect方法(在你的情况下应该很容易),毕竟你
正试图给UILabel一个不适合的行为

点赞