这个问题一直困扰着我。通常当我在Storyboard中布置UILabel时,我希望它可以使用不同的屏幕宽度进行缩放。我通过创建一个约束来使用它,该约束将其宽度设置为与其超视图的宽度成比例。
然后我将文本的大小设置为300,打开自动收缩并将最小大小设置为1.理想情况下,这会缩小文本,以便在拟合约束时最大可能。
但是,这种情况发生了。
左侧的标签已自动收缩,但文字未展开以填充(黄色只是标签的背景,而不是另一个视图)。另一方面,右边的标签有一个固定的大小,但宽度相同,表明字体有更大的增长空间。
出了什么问题?任何修复都将不胜感激。
答案 0 :(得分:2)
经过反复试验,我找到了解决此问题的方法,以较小的间隔1收缩字体,以便更好地符合标签的宽度。
extension UILabel {
func shrinkToFitWidth(margin: CGFloat?) {
// margin parameter will shrink the font by a certain amount more than necessary.
// Use this if you want a label with smaller text on a bigger background. Otherwise, use 0.
var initialSize : CGSize = self.text!.sizeWithAttributes([NSFontAttributeName : self.font])
if initialSize.width > self.frame.size.width
{
while initialSize.width > self.frame.size.width
{
self.font = self.font.fontWithSize(self.font.pointSize - 1)
initialSize = self.text!.sizeWithAttributes([NSFontAttributeName : self.font])
}
} else {
while initialSize.width < self.frame.size.width
{
self.font = self.font.fontWithSize(self.font.pointSize + 1)
initialSize = self.text!.sizeWithAttributes([NSFontAttributeName : self.font])
}
// went 1 point too large so compensate here
self.font = self.font.fontWithSize(self.font.pointSize - 1)
}
self.font = self.font.fontWithSize(self.font.pointSize - margin!)
}
func shrinkToFitHeight(margin: CGFloat?) {
// margin parameter will shrink the font by a certain amount more than necessary.
// Use this if you want a label with smaller text on a bigger background. Otherwise, use 0.
var initialSize : CGSize = self.text!.sizeWithAttributes([NSFontAttributeName : self.font])
if initialSize.height > self.frame.size.height
{
while initialSize.height > self.frame.size.height
{
self.font = self.font.fontWithSize(self.font.pointSize - 1)
initialSize = self.text!.sizeWithAttributes([NSFontAttributeName : self.font])
}
} else {
while initialSize.height < self.frame.size.height
{
self.font = self.font.fontWithSize(self.font.pointSize + 1)
initialSize = self.text!.sizeWithAttributes([NSFontAttributeName : self.font])
}
// went 1 point too large so compensate here
self.font = self.font.fontWithSize(self.font.pointSize - 1)
}
self.font = self.font.fontWithSize(self.font.pointSize - margin!)
}
请注意,为了实现这一点,应该在视图控制器的viewDidLayoutSubviews
方法中调用它,以便应用约束。
干杯!