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.

lebih baik
sumber
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];
kode minyak
sumber
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];
Gnawbone
sumber
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)
Jeli
sumber
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];
    }
}
Dan Rosenstark
sumber
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 ()
);
pengujian
sumber
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)];`
Marijn
sumber
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;
mikeho
sumber
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
                                            );
Mat
sumber
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

jenish
sumber