web-dev-qa-db-ja.com

特定のフォントとフォントサイズのテキスト文字列の幅を計算する方法は?

文字を表示するUILabelがあります。 「x」、「y」、「rpm」など。ラベル内のテキストの幅を計算するにはどうすればよいですか(使用可能なスペース全体を使用しません)。これは、自動レイアウト用です。UILabelのテキストが小さい場合、別のビューのフレーム長方形が大きくなります。 UIFontとフォントサイズが指定されているときにテキストの幅を計算する方法はありますか?また、改行はなく、1行だけです。

61
HelloMoon

NSString UIKit Additions のさまざまなsizeWithFont:メソッドを介して、まさにそれを行うことができます。あなたの場合、最も単純なバリアントで十分です(複数行のラベルがないため):

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

この方法にはいくつかのバリエーションがあります。改行モードまたは最大サイズを考慮するものもあります。

66
Daniel Rinser

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];
69
wcochran

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)
}

サイズは、「Your Text Here」の画面上のサイズである必要があります。

66
Glenn Howes

Glenn Howesの優れた答え に基づいて、文字列の幅を計算する拡張機能を作成しました。 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)
39
Adrian

Oneliner in Swift 4.2 ????

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

Swift-5

IntrinsicContentSizeを使用して、テキストの高さと幅を見つけます。

yourLabel.intrinsicContentSize.width

"T E X T"のように、文字列間にカスタムの間隔があっても機能します

8
Alok

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}
5
JsW

スイフト4

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

これはSwift 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)
    }
2
Mandeep Singh

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!)
1
Lakhdeep Singh

私がそれをやっている方法は、UIFontの拡張を作成することです:(これはSwift 4.1です)

extension UIFont {


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

} // extension UIFont
0
MarkAurelius