在 UIButton 标签上执行 adjustsFontSizeToWidth 后计算字体点大小

Posted

技术标签:

【中文标题】在 UIButton 标签上执行 adjustsFontSizeToWidth 后计算字体点大小【英文标题】:Calculating the font point size after adjustsFontSizeToWidth has been performed on UIButton label 【发布时间】:2015-08-23 20:24:18 【问题描述】:

我一直在使用以下代码计算标签字体大小 after the adjustsFontSizeToFitWidth has been performed 在使用 AutoLayout 约束的标签上,并且效果很好:

NSStringDrawingContext *labelContext = [NSStringDrawingContext new];
labelContext.minimumScaleFactor = label.minimumScaleFactor;
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:label.text attributes:@NSFontAttributeName : label.font];    
[attributedString boundingRectWithSize:label.frame.size options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:labelContext];
_fontSize = label.font.pointSize * labelContext.actualScaleFactor;

在我的故事板中,我将线条设置为 1 和最小字体比例,如下所示:

但是我尝试在 UIButton 上使用完全相同的方法,唯一的区别是我访问 UIButton 的 titleLabel 属性,如下所示:

NSStringDrawingContext *labelContext = [NSStringDrawingContext new];
labelContext.minimumScaleFactor = _Button.titleLabel.minimumScaleFactor;
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:_Button.titleLabel.text attributes:@NSFontAttributeName : _Button.titleLabel.font];

[attributedString boundingRectWithSize:_Button.frame.size options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:labelContext];


_fontSize = _Button.titleLabel.font.pointSize * labelContext.actualScaleFactor;

虽然我的按钮的 label.font 正在根据宽度调整字体大小,但字体大小的计算不会返回比 Storyboard 中设置的字体大小更小的字体大小。

这可能是因为我没有像我对 UILabel 所做的那样,为故事板中的 Button.label 明确设置最小比例因子。我尝试在 viewDidLoad 方法中的 button.titleLabel 上设置 minimumScaleFactor,但这会导致 fontSize 结果被该数字精确缩放,并且似乎没有考虑边界按钮框的宽度.

【问题讨论】:

【参考方案1】:

使用titleLabel 获取标题文本、字体颜色或阴影颜色不是一个好主意。你试过-attributedTitleForState:吗?

NSAttributedString *attributedString = [_Button attributedTitleForState:UIControlStateNormal];

为了澄清,我的建议是替换你设置attributedString的方式。

从问题中替换

NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:_Button.titleLabel.text attributes:@NSFontAttributeName : _Button.titleLabel.font];

NSAttributedString *attributedString = [_Button attributedTitleForState:UIControlStateNormal];

如果-attributedTitleForState: 返回nil,这些都不重要。

可以试试替换

NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:_Button.titleLabel.text attributes:@NSFontAttributeName : _Button.titleLabel.font];

NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:[_Button titleForState:UIControlStateNormal] attributes:@NSFontAttributeName : _Button.titleLabel.font];

【讨论】:

不幸的是,这会返回一个 nil 对象。 我正在尝试访问新计算的字体磅值而不是上述任何一个 @LindaKeating 如果-attributedTitleForState: 返回nil,则按钮没有标题"If no attributed title has been set for UIControlStateNormal, returns nil." 我认为更具体地说它没有属性标题 - 但它确实有标题。 developer.apple.com/library/ios/documentation/UIKit/Reference/…: @LindaKeating 对于其他控件,如 UILabel,您可以设置文本值并取回属性文本值。现在回想起来,我认为 UIButton 的工作方式不同,所以这个假设是错误的。无论哪种方式,您都不应该使用titleLabel.text,而是尝试使用-titleForState:

以上是关于在 UIButton 标签上执行 adjustsFontSizeToWidth 后计算字体点大小的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式更改UIButton标签

使用 UILabel 和 UIButton 显示用户标签

UIButton 的标题标签未显示

具有多个标签的 iOS UIButton

UIButton 上的标签显示已损坏

在 TableViewCell 内单击时 UIButton 标签重置