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

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

Ответы [ 11 ]

67 голосов
/ 28 февраля 2014

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];
65 голосов
/ 25 августа 2009

Поскольку 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)
}

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

64 голосов
/ 25 августа 2009

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

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

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

35 голосов
/ 06 октября 2016

На основании превосходного ответа Гленна Хоуза , я создал расширение для вычисления ширины строки. Если вы делаете что-то вроде установки ширины 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)
12 голосов
/ 09 августа 2018

Oneliner в Swift 4.2 ?

let size = text.size(withAttributes:[.font: UIFont.systemFont(ofSize:18.0)])
5 голосов
/ 18 сентября 2018

Swift-5

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

yourLabel.intrinsicContentSize.width

Это будет работать, даже если у вас есть произвольный интервал между строками, например "T E X T"

5 голосов
/ 09 июля 2017

Это простое расширение в 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}
3 голосов
/ 27 августа 2018

Свифт 4

extension String {
    func SizeOf(_ font: UIFont) -> CGSize {
        return self.size(withAttributes: [NSAttributedStringKey.font: font])
    }
}
2 голосов
/ 23 сентября 2016

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

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)
    }
1 голос
/ 06 октября 2017

Для 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!)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...