繁体   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