为什么 autoshrink 不能正常工作?
Why is autoshrink not working properly?
这个问题困扰了我好久。通常,当我在 Storyboard 中布局 UILabel 时,我希望它可以根据不同的屏幕宽度进行缩放。我通过创建一个约束来使用它,该约束将其宽度设置为与其父视图的宽度成比例。
然后我将文本的大小设置为 300,打开自动收缩并将最小大小设置为 1。理想情况下,这会缩小文本,使其在符合约束的情况下尽可能大。
但是,这种情况发生了。
左侧的标签 自动收缩 但文本不会扩展以填充(黄色只是标签的背景,而不是另一个视图)。另一方面,右侧的label大小固定但宽度相同,显示字体有更大的增长空间。
怎么了?任何修复将不胜感激。
经过反复试验,我找到了解决此问题的方法,它以 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
方法中调用它,以便应用约束。
干杯!
这个问题困扰了我好久。通常,当我在 Storyboard 中布局 UILabel 时,我希望它可以根据不同的屏幕宽度进行缩放。我通过创建一个约束来使用它,该约束将其宽度设置为与其父视图的宽度成比例。
然后我将文本的大小设置为 300,打开自动收缩并将最小大小设置为 1。理想情况下,这会缩小文本,使其在符合约束的情况下尽可能大。
但是,这种情况发生了。
左侧的标签 自动收缩 但文本不会扩展以填充(黄色只是标签的背景,而不是另一个视图)。另一方面,右侧的label大小固定但宽度相同,显示字体有更大的增长空间。
怎么了?任何修复将不胜感激。
经过反复试验,我找到了解决此问题的方法,它以 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
方法中调用它,以便应用约束。
干杯!