iOS 7 sizeWithAttributes: pengganti sizeWithFont: constrainedToSize


132

Bagaimana Anda mengembalikan teks multiline CGSize dari metode iOS 7 baru sizeWithAttributes?

Saya ingin ini menghasilkan hasil yang sama dengan sizeWithFont: constrainedToSize.

NSString *text = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus eu urna quis lacus imperdiet scelerisque a nec neque. Mauris eget feugiat augue, vitae porttitor mi. Curabitur vitae sollicitudin augue. Donec id sapien eros. Proin consequat tellus in vehicula sagittis. Morbi sed felis a nibh hendrerit hendrerit. Lorem ipsum dolor sit."

CGSize textSize = [text sizeWithAttributes:@{ NSFontAttributeName : [UIFont fontWithName:@"HelveticaNeue-Light" size:16.0] }];

Metode ini hanya menghasilkan ketinggian untuk satu baris teks.



6
+1 karena memiliki font yang sama dengan saya :)
Lescai Ionel

Jawaban:


293

baik Anda dapat mencoba ini:

NSDictionary *attributes = @{NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue" size:14]};
// NSString class method: boundingRectWithSize:options:attributes:context is
// available only on ios7.0 sdk.
CGRect rect = [textToMeasure boundingRectWithSize:CGSizeMake(width, CGFLOAT_MAX)
                                          options:NSStringDrawingUsesLineFragmentOrigin
                                       attributes:attributes
                                          context:nil];

4
Untuk pertama kalinya saya melihat notasi ini untuk kamus @{...}. Disebut apakah itu?
Martin Berger

4
Bro, aku hampir kehilangan kepercayaan pada SO, lalu aku datang ke sini.
NSPunk

21
Wow. Jauh lebih tumpul daripada sizeWithFont:constrainedToSize:metode asli yang sudah usang. Apple pasti sangat membenci kita. Bagaimanapun, +1.
Agustus

1
Mengapa Anda menggunakan MAXFLOATbukan CGFLOAT_MAX?
Julian F. Weinert

19
Versi cepat:var size = textToMeasure.boundingRectWithSize( CGSizeMake(width, CGFloat.max), options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes:attrs, context:nil).size
mdziadkowiec

23

Beginilah cara saya melakukannya:

    // Get a font to draw it in
UIFont *font = [UIFont boldSystemFontOfSize: 28];

CGRect textRect;
NSDictionary *attributes = @{NSFontAttributeName: font};

// How big is this string when drawn in this font?
textRect.size = [text sizeWithAttributes:attributes];

// Draw the string
[text drawInRect:textRect withAttributes:attributes];

2
Ini tidak akan berfungsi jika string panjang harus putus di akhir baris. Lihat jawaban elio.d, yang benar.
Julian F. Weinert

4

Swift 2.3:

let attributes = [NSFontAttributeName:UIFont(name: "HelveticaNeue", size: 14)]
let rect = NSString(string: textToMeasure).boundingRectWithSize(
        CGSizeMake(width, CGFLOAT_MAX), 
        options: NSStringDrawingOptions.UsesLineFragmentOrigin, 
        attributes: attributes, context: nil)

Swift 4:

let attributes = [NSFontAttributeName:UIFont(name: "HelveticaNeue", size: 14)]
let rect = NSString(string: textToMeasure).boundingRect(
                    with: CGSize(width: width, height: CGFloat.greatestFiniteMagnitude),
                    options: NSStringDrawingOptions.usesLineFragmentOrigin,
                    attributes: attributes as [NSAttributedString.Key : Any], context: nil)

3

Inilah metode saya untuk menangani kedua situasi, masuk dalam NSStringkategori.

- (CGSize) sizeWithFontOrAttributes:(UIFont *) font {
    if (IS_IOS7) {
        NSDictionary *fontWithAttributes = @{NSFontAttributeName:font};
        return [self sizeWithAttributes:fontWithAttributes];
    } else {
        return [self sizeWithFont:font];
    }
}

3

Untuk Xamarin.iOS:

UIFont descriptionLabelFont =  UIFont.SystemFontOfSize (11);
NSString textToMeasure = (NSString)DescriptionLabel.Text;

CGRect labelRect = textToMeasure.GetBoundingRect (
    new CGSize(this.Frame.Width, nfloat.MaxValue), 
    NSStringDrawingOptions.UsesLineFragmentOrigin, 
    new UIStringAttributes () { Font = descriptionLabelFont }, 
    new NSStringDrawingContext ()
);

2

Jika Anda memiliki teks, font, numberOfLines, dan lebar set label Anda, metode ini mengembalikan ukuran label Anda:

myLabel.numberOfLines = 0;

CGSize size = [myLabel sizeThatFits:CGSizeMake(myLabel.frame.size.width, CGFLOAT_MAX)];`

1

Sebagai alternatif, jika Anda melihatnya UITextView, Anda selalu dapat menggunakan NSLayoutManagermetode ini:

CGSize textSize = [textView.layoutManager usedRectForTextContainer:textView.textContainer].size;

Anda juga dapat menemukan ketinggian garis untuk font tertentu dengan:

UIFont *font;
CGFloat lineHeight = font.lineHeight;

0

[Sebagai pengguna baru, saya tidak bisa memposting komentar ke jawaban @ testing, tetapi untuk membuat jawabannya (untuk xamarin.ios) lebih bermanfaat]

Kami dapat mengembalikan CGRect dan hanya menggunakan parameter tinggi untuk item gui yang kami targetkan UIButton dll. Melewati semua parameter yang kami butuhkan seperti di bawah ini

    public CGRect GetRectForString(String strMeasure, int fontSize, nfloat guiItemWidth)
    {
        UIFont descriptionLabelFont =  UIFont.SystemFontOfSize (fontSize);
        NSString textToMeasure = (NSString)strMeasure;

        CGRect labelRect = textToMeasure.GetBoundingRect (
            new CGSize(guiItemWidth, nfloat.MaxValue), 
            NSStringDrawingOptions.UsesLineFragmentOrigin, 
            new UIStringAttributes () { Font = descriptionLabelFont }, 
            new NSStringDrawingContext ()
        );

        return labelRect;
    }

        header_Revision.Frame = new CGRect (5
                                            , verticalAdjust
                                            , View.Frame.Width-10
                                            , GetRectForString( header_Revision.Title(UIControlState.Normal)
                                                              , 18
                                                              , View.Frame.Width-10 ).Height
                                            );

Ini sebenarnya seharusnya berada di bawah kode pengujian yang bagus untuk Xamarin.IOS :) Semoga membantu siapa pun :)
Matt

Ketika Anda memiliki lebih banyak perwakilan, komentar seperti ini biasanya akan ditambahkan ke pos. Anda belum bisa melakukannya, jadi terima kasih untuk data tambahan, dan selamat datang di Stack Overflow.
Stuart Siegler

0
CGSize stringsize = [lbl.text sizeWithAttributes:
                         @{NSFontAttributeName:[UIFont fontWithName:FontProximaNovaRegular size:12.0]}];


CGSize adjustedSize = CGSizeMake(ceilf(stringsize.width), ceilf(stringsize.height));

gunakan ceilfmetode untuk mengelola dengan benar

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.