簡體   English   中英

如何計算特定字體和字體大小的文本字符串的寬度?

[英]How to calculate the width of a text string of a specific font and font-size?

我有一個顯示一些字符的 UILabel。 如“x”、“y”或“rpm”。 如何計算標簽中文本的寬度(它不使用整個可用空間)? 這是用於自動布局,如果 UILabel 中的文本較小,則另一個視圖將具有更大的框架矩形。 指定 UIFont 和字體大小時,是否有方法計算文本的寬度? 也沒有換行符,只有一行。

我有一個顯示一些字符的UILabel。 如“ x”,“ y”或“ rpm”。 如何計算標簽中文本的寬度(它不會占用整個可用空間)? 這是用於自動布局的,如果UILabel的內部文本較小,則另一個視圖將具有較大的框架矩形。 指定了UIFont和字體大小時,是否有方法來計算文本的寬度? 也沒有換行符,只有一行。

我有一個顯示一些字符的UILabel。 如“ x”,“ y”或“ rpm”。 如何計算標簽中文本的寬度(它不會占用整個可用空間)? 這是用於自動布局的,如果UILabel的內部文本較小,則另一個視圖將具有較大的框架矩形。 指定了UIFont和字體大小時,是否有方法來計算文本的寬度? 也沒有換行符,只有一行。

我有一個顯示一些字符的UILabel。 如“ x”,“ y”或“ rpm”。 如何計算標簽中文本的寬度(它不會占用整個可用空間)? 這是用於自動布局的,如果UILabel的內部文本較小,則另一個視圖將具有較大的框架矩形。 指定了UIFont和字體大小時,是否有方法來計算文本的寬度? 也沒有換行符,只有一行。

我有一個顯示一些字符的UILabel。 如“ x”,“ y”或“ rpm”。 如何計算標簽中文本的寬度(它不會占用整個可用空間)? 這是用於自動布局的,如果UILabel的內部文本較小,則另一個視圖將具有較大的框架矩形。 指定了UIFont和字體大小時,是否有方法來計算文本的寬度? 也沒有換行符,只有一行。

我有一個顯示一些字符的UILabel。 如“ x”,“ y”或“ rpm”。 如何計算標簽中文本的寬度(它不會占用整個可用空間)? 這是用於自動布局的,如果UILabel的內部文本較小,則另一個視圖將具有較大的框架矩形。 指定了UIFont和字體大小時,是否有方法來計算文本的寬度? 也沒有換行符,只有一行。

我有一個顯示一些字符的UILabel。 如“ x”,“ y”或“ rpm”。 如何計算標簽中文本的寬度(它不會占用整個可用空間)? 這是用於自動布局的,如果UILabel的內部文本較小,則另一個視圖將具有較大的框架矩形。 指定了UIFont和字體大小時,是否有方法來計算文本的寬度? 也沒有換行符,只有一行。

我有一個顯示一些字符的UILabel。 如“ x”,“ y”或“ rpm”。 如何計算標簽中文本的寬度(它不會占用整個可用空間)? 這是用於自動布局的,如果UILabel的內部文本較小,則另一個視圖將具有較大的框架矩形。 指定了UIFont和字體大小時,是否有方法來計算文本的寬度? 也沒有換行符,只有一行。

我有一個顯示一些字符的UILabel。 如“ x”,“ y”或“ rpm”。 如何計算標簽中文本的寬度(它不會占用整個可用空間)? 這是用於自動布局的,如果UILabel的內部文本較小,則另一個視圖將具有較大的框架矩形。 指定了UIFont和字體大小時,是否有方法來計算文本的寬度? 也沒有換行符,只有一行。

我有一個顯示一些字符的UILabel。 如“ x”,“ y”或“ rpm”。 如何計算標簽中文本的寬度(它不會占用整個可用空間)? 這是用於自動布局的,如果UILabel的內部文本較小,則另一個視圖將具有較大的框架矩形。 指定了UIFont和字體大小時,是否有方法來計算文本的寬度? 也沒有換行符,只有一行。

我有一個顯示一些字符的UILabel。 如“ x”,“ y”或“ rpm”。 如何計算標簽中文本的寬度(它不會占用整個可用空間)? 這是用於自動布局的,如果UILabel的內部文本較小,則另一個視圖將具有較大的框架矩形。 指定了UIFont和字體大小時,是否有方法來計算文本的寬度? 也沒有換行符,只有一行。

我有一個顯示一些字符的UILabel。 如“ x”,“ y”或“ rpm”。 如何計算標簽中文本的寬度(它不會占用整個可用空間)? 這是用於自動布局的,如果UILabel的內部文本較小,則另一個視圖將具有較大的框架矩形。 指定了UIFont和字體大小時,是否有方法來計算文本的寬度? 也沒有換行符,只有一行。

我有一個顯示一些字符的UILabel。 如“ x”,“ y”或“ rpm”。 如何計算標簽中文本的寬度(它不會占用整個可用空間)? 這是用於自動布局的,如果UILabel的內部文本較小,則另一個視圖將具有較大的框架矩形。 指定了UIFont和字體大小時,是否有方法來計算文本的寬度? 也沒有換行符,只有一行。

我有一個顯示一些字符的UILabel。 如“ x”,“ y”或“ rpm”。 如何計算標簽中文本的寬度(它不會占用整個可用空間)? 這是用於自動布局的,如果UILabel的內部文本較小,則另一個視圖將具有較大的框架矩形。 指定了UIFont和字體大小時,是否有方法來計算文本的寬度? 也沒有換行符,只有一行。

Swift5 的 SwiftUI

在 SwiftUI 中,您找不到將 UIFont 轉換為 Font 的簡單方法。 所以以前的答案可能不起作用。 您可以在overlay()修飾符中使用GeometryReader{ geometryProxy in }來獲取文本大小。 請注意,如果您不在 overlay() 中使用它,View 將盡可能地擴展。

如果您想將變量傳遞出去,您可能需要編寫一個 View 擴展函數來執行此操作。

Text("Lat.: \(latitude), Lon.: \(longitude) ")
    .font(Font.custom("ChalkboardSE-Light",size: 20))
    .overlay(
    GeometryReader{ geometryProxy in
        Image("button_img")
             .resizable()
             .frame(width: 10 , height: 10)
             .offset(x: geometryProxy.size.width)
             .extensionFunction{ //... }
              })
    

幾天前我從另一個線程復制了擴展功能。

extension View{
    func extensionFunction(_ closure:() -> Void) -> Self{
        closure()
        return self
    }
    
}

2022 年更新。

對於這個非常古老的問題/答案,我只是采用當前始終有效的方式來做,這是下面答案的組合。

總是指的是最常見的情況——不幸的是,這是最棘手的情況——當你從字面上修改drawText#in rect的某些內容時。

fileprivate extension String {
    func realSize(font: UIFont) -> CGSize {
        var s = self.size(withAttributes: [NSAttributedString.Key.font: font])
        s.width = size.width.rounded(.up)
        s.height = size.height.rounded(.up)
        return s
    }
}

請注意,它四舍五入大小(具體來說,向上)。 為什么? 在大多數情況下,你會想要這個,因為通常布局具有均勻大小的點,這是“你需要的”來匹配其他渲染。

(請注意,無論如何差異絕對很小)。 兩種方式都試試看,如您所願。

因此,例如像

class StableLabel: UILabel {

    override var intrinsicContentSize: CGSize {
        // we arrange to return some fixed-always size ...
    }

    override func drawText(in rect: CGRect) {
        let painful = text!.realSize(font: font)

        // Assuming the size of this label is absolutely fixed by the layout,
        // we want to ALWAYS draw the text sitting at the BOTTOM CENTER
        // of the fixed size of this label, even as the size is changed.
        // For example a focus or such may be changing the point size.

        let left = knownSize.width - painful.width) / 2.0
        let down = knownSize.height - painful.height)
        let r = CGRect(origin: CGPoint(x: left, y: down), size: painful)
        super.drawText(in: r)
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM