Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何检查UILabel的当前字体大小?_Ios_Swift_Uikit - Fatal编程技术网

Ios 如何检查UILabel的当前字体大小?

Ios 如何检查UILabel的当前字体大小?,ios,swift,uikit,Ios,Swift,Uikit,我有3个ui标签,我想为所有标签设置相同的字体(3种可能性中最小的一种)。有什么问题?我不知道如何检查当前字体-每个UILabels使用Autoshrink,最小字体比例和行数等于0。UILabels的文本在ViewDidLoad()方法中设置(有许多可能的标签文本组合) 我尝试使用UILabel.font.pointSize属性(在viewdideappease()方法中调用)获取当前字体大小,然后比较所有字体大小。问题在于,UILabel.font.pointSize返回的不是UILabel

我有3个
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。我需要解决这个问题