Подтвердить что ты не робот

Как рассчитать ширину текстовой строки определенного шрифта и размера шрифта?

У меня есть UILabel, который отображает некоторые символы. Как "x", "y" или "rpm". Как я могу рассчитать ширину текста в метке (это не означает все свободное пространство)? Это для автоматического макетирования, где другое представление будет иметь больший прямоугольник рамки, если этот UILabel имеет меньший текст внутри. Существуют ли методы вычисления этой ширины текста при задании размера UIFont и размера шрифта? Там также нет разрыва строки и только одна строка.

4b9b3361

Ответ 1

Вы можете сделать именно это с помощью различных методов sizeWithFont: в NSString UIKit Additions. В вашем случае простейший вариант должен быть достаточным (так как у вас нет многострочных меток):

NSString *someString = @"Hello World";
UIFont *yourFont = // [UIFont ...]
CGSize stringBoundingBox = [someString sizeWithFont:yourFont];

Существует несколько вариантов этого метода, например. некоторые рассматривают режимы разрыва линии или максимальные размеры.

Ответ 2

sizeWithFont: теперь устарел, вместо этого используйте sizeWithAttributes::

UIFont *font = [UIFont fontWithName:@"Helvetica" size:30];
NSDictionary *userAttributes = @{NSFontAttributeName: font,
                                 NSForegroundColorAttributeName: [UIColor blackColor]};
NSString *text = @"hello";
...
const CGSize textSize = [text sizeWithAttributes: userAttributes];

Ответ 3

Поскольку sizeWithFont устарела, я просто собираюсь обновить свой первоначальный ответ, используя Swift 4 и .size

//: Playground - noun: a place where people can play

import UIKit

if let font = UIFont(name: "Helvetica", size: 24) {
   let fontAttributes = [NSAttributedStringKey.font: font]
   let myText = "Your Text Here"
   let size = (myText as NSString).size(withAttributes: fontAttributes)
}

Размер должен быть на экране размером "Ваш текст здесь" в пунктах.

Ответ 4

Обновление сентября 2019

Этот ответ - намного более чистый способ сделать это с использованием нового синтаксиса.

Оригинальный ответ

Основываясь на превосходном ответе Гленна Хоуза, я создал расширение для вычисления ширины строки. Если вы делаете что-то вроде установки ширины UISegmentedControl, это может установить ширину на основе строки заголовка сегмента.

extension String {

    func widthOfString(usingFont font: UIFont) -> CGFloat {
        let fontAttributes = [NSAttributedString.Key.font: font]
        let size = self.size(withAttributes: fontAttributes)
        return size.width
    }

    func heightOfString(usingFont font: UIFont) -> CGFloat {
        let fontAttributes = [NSAttributedString.Key.font: font]
        let size = self.size(withAttributes: fontAttributes)
        return size.height
    }

    func sizeOfString(usingFont font: UIFont) -> CGSize {
        let fontAttributes = [NSAttributedString.Key.font: font]
        return self.size(withAttributes: fontAttributes)
    }
}

использование:

    // Set width of segmentedControl
    let starString = "⭐️"
    let starWidth = starString.widthOfString(usingFont: UIFont.systemFont(ofSize: 14)) + 16
    segmentedController.setWidth(starWidth, forSegmentAt: 3)

Ответ 5

Oneliner в Swift 4.2 🔸

let size = text.size(withAttributes:[.font: UIFont.systemFont(ofSize:18.0)])

Ответ 6

Swift-5

Используйте intrinsicContentSize, чтобы найти высоту и ширину текста.

yourLabel.intrinsicContentSize.width

Это будет работать, даже если у вас есть пользовательский интервал между вашей строкой, как "TEXT"

Ответ 7

Это простое расширение в Swift хорошо работает.

extension String {
    func size(OfFont font: UIFont) -> CGSize {
        return (self as NSString).size(attributes: [NSFontAttributeName: font])
    }
}

Использование:

let string = "hello world!"
let font = UIFont.systemFont(ofSize: 12)
let width = string.size(OfFont: font).width // size: {w: 98.912 h: 14.32}

Ответ 8

Swift 4

extension String {
    func SizeOf(_ font: UIFont) -> CGSize {
        return self.size(withAttributes: [NSAttributedStringKey.font: font])
    }
}

Ответ 9

Это для быстрой версии 2.3. Вы можете получить ширину строки.

var sizeOfString = CGSize()
if let font = UIFont(name: "Helvetica", size: 14.0)
    {
        let finalDate = "Your Text Here"
        let fontAttributes = [NSFontAttributeName: font] // it says name, but a UIFont works
        sizeOfString = (finalDate as NSString).sizeWithAttributes(fontAttributes)
    }

Ответ 10

Для Swift 3. 0+

extension String {
    func SizeOf_String( font: UIFont) -> CGSize {
        let fontAttribute = [NSFontAttributeName: font]
        let size = self.size(attributes: fontAttribute)  // for Single Line
       return size;
   }
}

Используйте это как...

        let Str = "ABCDEF"
        let Font =  UIFont.systemFontOfSize(19.0)
        let SizeOfString = Str.SizeOfString(font: Font!)

Ответ 11

То, как я это делаю, мой код - сделать расширение UIFont: (это Swift 4.1)

extension UIFont {


    public func textWidth(s: String) -> CGFloat
    {
        return s.size(withAttributes: [NSAttributedString.Key.font: self]).width
    }

} // extension UIFont