Ios 如何检查UILabel的当前字体大小?
我有3个Ios 如何检查UILabel的当前字体大小?,ios,swift,uikit,Ios,Swift,Uikit,我有3个ui标签,我想为所有标签设置相同的字体(3种可能性中最小的一种)。有什么问题?我不知道如何检查当前字体-每个UILabels使用Autoshrink,最小字体比例和行数等于0。UILabels的文本在ViewDidLoad()方法中设置(有许多可能的标签文本组合) 我尝试使用UILabel.font.pointSize属性(在viewdideappease()方法中调用)获取当前字体大小,然后比较所有字体大小。问题在于,UILabel.font.pointSize返回的不是UILabel
ui标签
,我想为所有标签设置相同的字体(3种可能性中最小的一种)。有什么问题?我不知道如何检查当前字体-每个UILabels
使用Autoshrink
,最小字体比例和行数等于0。UILabels的文本在ViewDidLoad()
方法中设置(有许多可能的标签文本组合)
我尝试使用UILabel.font.pointSize
属性(在viewdideappease()
方法中调用)获取当前字体大小,然后比较所有字体大小。问题在于,UILabel.font.pointSize
返回的不是UILabel文本字体大小的当前值(在Autoshrink
完成后),而是脚本中设置的值
我完全没有主意了,谢谢你的帮助
您好,John我发现在
viewDidLoad()中,您的约束尚未完全定义。您可以尝试用另一种方法来进行这些计算,例如viewwillappease()
或任何适合您的方法,并在viewDidLoad()
之后执行。这是获取UILabel pointsize当前大小的一种方法,尽管如果不起作用,我知道有更多方法。这是最干净最快的。请参阅包含的示例和扩展
import UIKit
class ViewController: UIViewController {
lazy var label1 : UILabel = {
let lbl = UILabel(frame: CGRect(x: 20, y: 80, width: self.view.bounds.width - 40, height: 40))
lbl.text = "This is some large text to make it fit to size with a big font size"
lbl.font = UIFont.systemFont(ofSize: 50, weight: .bold)
lbl.textColor = .black
lbl.minimumScaleFactor = 0.01
lbl.adjustsFontSizeToFitWidth = true
lbl.numberOfLines = 0
return lbl
}()
lazy var label2 : UILabel = {
let lbl = UILabel(frame: CGRect(x: 20, y: label1.frame.maxY + 5, width: self.view.bounds.width - 40, height: 40))
lbl.text = "This is one line"
lbl.font = UIFont.systemFont(ofSize: 20, weight: .bold)
lbl.textColor = .black
lbl.minimumScaleFactor = 0.01
lbl.adjustsFontSizeToFitWidth = true
lbl.numberOfLines = 0
return lbl
}()
lazy var label3 : UILabel = {
let lbl = UILabel(frame: CGRect(x: 20, y: label2.frame.maxY + 10, width: self.view.bounds.width - 40, height: 80))
lbl.text = "This is some large text to make it fit to size with a big font size"
lbl.font = UIFont.systemFont(ofSize: 100, weight: .bold)
lbl.textColor = .black
lbl.minimumScaleFactor = 0.01
lbl.adjustsFontSizeToFitWidth = true
lbl.numberOfLines = 0
return lbl
}()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.view.addSubview(label1)
self.view.addSubview(label2)
self.view.addSubview(label3)
var minSize : CGFloat = .greatestFiniteMagnitude
for sub in self.view.subviews{
if let lbl = sub as? UILabel{
//get the size
let font = lbl.adjustedFont()
print("the size is \(font.pointSize)")
minSize = min(font.pointSize,minSize)
}
}
print("the minimum for all fonts is \(minSize)")
print("i am going to delay for 3 seconds and then reset all the labels to the minimum size :)")
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3.0) {
for sub in self.view.subviews{
if let lbl = sub as? UILabel{
lbl.font = lbl.font.withSize(minSize)
}
}
}
}
}
extension UILabel{
func adjustedFont()->UIFont {
guard let txt = text else {
return self.font
}
let attributes: [NSAttributedString.Key: Any] = [.font: self.font]
let attributedString = NSAttributedString(string: txt, attributes: attributes)
let drawingContext = NSStringDrawingContext()
drawingContext.minimumScaleFactor = self.minimumScaleFactor
attributedString.boundingRect(with: bounds.size,
options: [.usesLineFragmentOrigin,.usesFontLeading],
context: drawingContext)
let fontSize = font.pointSize * drawingContext.actualScaleFactor
return font.withSize(CGFloat(floor(Double(fontSize))))
}
}
行动中的例子
使用此扩展名
extension String {
func height(withConstrainedWidth width: CGFloat, font: UIFont) -> CGFloat {
let constraintRect = CGSize(width: width, height: .greatestFiniteMagnitude)
let boundingBox = self.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil)
return ceil(boundingBox.height)
}
}
获得高度
height = strDesc.height(withConstrainedWidth: UIScreen.main.bounds.size.width - 160, font: UIFont.systemFont(ofSize: 14.0))
您是否尝试直接分配UIFont属性label2.font=label1.font
?是。我的意思是,即使我打印了myLabel.font.pointSize
我也从故事板中获得了价值,这绝对是一个巨大的真实价值(对于3个字体大小不同的标签也是如此)。Aff,我的坏,我在堆栈帖子中写了坏。我在ofc的视图中调用了它,但非常感谢。
是的,这肯定是我问题的解决方案,非常感谢@Janoz在扩展中,scaleFactor也应该是label.minimumScaleFactor。我需要解决这个问题