我一直在寻找动态调整fontSize
以适应布局框宽度的内容。但我能找到的所有答案要么是使用它:
label.adjustsFontSizeToFitWidth = true
哪个确实有效。但是,只有我没有setTranslatesAutoresizingMaskIntoConstraints
设置为false
。
请注意,我不使用故事板。因此,为了完全控制我的其他约束,我需要这一行:
label.setTranslatesAutoresizingMaskIntoConstraints(false)
那么如何在不使用故事板的情况下调整字体大小以适应宽度,以及何时我无法使用adjustsFontSizeToFitWidth
。
在我弄清楚如何调整字体大小以适应宽度之后。我还需要调整布局框的高度以适应字体大小。虽然似乎有关于这方面的文件,但是如果你碰巧知道这个问题的答案,那将非常感激。
提前致谢
答案 0 :(得分:41)
请为您的标签尝试以下命令:
label.adjustsFontSizeToFitWidth = true
label.minimumScaleFactor = 0.2
并尝试将标签的行更改为0和1(检查两种情况):
label.numberOfLines = 0 // or 1
答案 1 :(得分:13)
MinimumScaleFactor
范围是0到1.因此我们根据字体大小设置[lb setMinimumScaleFactor:10.0/[UIFont labelFontSize]];
lb.adjustsFontSizeToFitWidth = YES;
,如下所示
目标C
lb.minimumScaleFactor = 10/UIFont.labelFontSize
lb.adjustsFontSizeToFitWidth = true
Swift 3.0
{{1}}
答案 2 :(得分:3)
我不知道这是否会完全回答您的问题,但您可以使用此扩展程序来计算自己适合的字体大小。
extension String {
func height(constrainedBy width: CGFloat, with font: UIFont) -> CGFloat {
let constraintSize = CGSize(width: width, height: .max)
let boundingBox = self.boundingRectWithSize(constraintSize, options: .UsesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil)
return boundingBox.height
}
func width(constrainedBy height: CGFloat, with font: UIFont) -> CGFloat {
let constrainedSize = CGSize(width: .max, height: height)
let boundingBox = self.boundingRectWithSize(constrainedSize, options: .UsesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil)
return boundingBox.width
}
}
答案 3 :(得分:2)
我只是做了你需要的,完美的工作! (仅限编程) - 我们为标签设置了较大的字体大小,以便将其重新缩放到完美的字体大小。
self.label.font = UIFont(name: "Heiti TC", size: 60)
self.label.numberOfLines = 0
self.label.minimumScaleFactor = 0.1
self.label.baselineAdjustment = .alignCenters
self.label.textAlignment = .center
如果您使用的是AutoLayout,请在viewDidLayoutSubviews
中实施此代码(布局布局后)。
你的,Roi
答案 4 :(得分:1)
我在UITableViewCell中使用UILabel时遇到了类似的问题,并且我的单元格也在动态调整其高度(如果您想了解更多有关动态单元格高度的信息,请参考此:https://www.raywenderlich.com/129059/self-sizing-table-view-cells)
无论我为最小的字体比例做了什么,它都没有用。事实证明,要使此功能正常工作,还必须将“换行”属性设置为“截尾”或“中间”或“头”。如果您有自动换行或自动换行,它将不会动态缩小UILabel字体(我创建了一个自定义字体,称为:Title 2)。
希望这可以帮助其他人找出答案。
这是我的UILabel属性的屏幕截图:
答案 5 :(得分:0)
这是一个黑客解决方案:
var size: CGFloat = 20
while titleLabel.frame.width > containerView.frame.width {
titleLabel.font = UIFont.systemFont(ofSize: size)
titleLabel.sizeToFit()
size -= 1
}
答案 6 :(得分:0)
上面的Swift 4转换:
extension String
{
func height(constrainedBy width: CGFloat, with font: UIFont) -> CGFloat
{
let constraintSize = CGSize(width: width, height: .greatestFiniteMagnitude)
let boundingBox = self.boundingRect(with: constraintSize, options: .usesLineFragmentOrigin, attributes: [NSAttributedStringKey.font: font], context: nil)
return boundingBox.height
}
func width(constrainedBy height: CGFloat, with font: UIFont) -> CGFloat
{
let constrainedSize = CGSize(width: .greatestFiniteMagnitude, height: height)
let boundingBox = self.boundingRect(with: constrainedSize, options: .usesLineFragmentOrigin, attributes: [NSAttributedStringKey.font: font], context: nil)
return boundingBox.width
}
}