在 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 后计算字体点大小的主要内容,如果未能解决你的问题,请参考以下文章