Penggantian untuk usang -ukuranWithFont: constrainedToSize: lineBreakMode: di iOS 7?

146

Di iOS 7, caranya:

- (CGSize)sizeWithFont:(UIFont *)font
     constrainedToSize:(CGSize)size
         lineBreakMode:(NSLineBreakMode)lineBreakMode 

dan metodenya:

- (CGSize)sizeWithFont:(UIFont *)font

sudah usang. Bagaimana saya bisa mengganti

CGSize size = [string sizeWithFont:font
                 constrainedToSize:constrainSize
                     lineBreakMode:NSLineBreakByWordWrapping];

dan:

CGSize size = [string sizeWithFont:font];
user_Dennis_Mostajo
sumber
2
metode penggantinya adalah -sizeWithAttributes:.
holex
ok holex terima kasih tetapi, bagaimana saya bisa menggunakan font dari label seperti NSDIctionary? jika kode saya seperti: sizeWithFont: customlabel.font; void bertanya "sizeWithAttributes: <# (NSDictionary *) #>"
user_Dennis_Mostajo
1
di sini adalah dokumentasi resmi tentang bagaimana Anda dapat mendefinisikan atribut: developer.apple.com/library/ios/documentation/UIKit/Reference/…
holex

Jawaban:

219

Anda bisa mencoba ini:

CGRect textRect = [text boundingRectWithSize:size
                                 options:NSStringDrawingUsesLineFragmentOrigin
                              attributes:@{NSFontAttributeName:FONT}
                                 context:nil];

CGSize size = textRect.size;

Cukup ubah "FONT" untuk "[font UIFont ....]"

Xavier Maroñas
sumber
13
Dan di mana Anda menyebutkan NSLineBreakByWordWrapping? Ke mana perginya?
user4951
32
NSLineBreakByWordWrappingakan masuk dalam a NSParagraphStyle. Jadi misalnya: NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping;Dalam atribut Anda perlu menambahkan NSParagraphStyleAttributeName: paragraphStyle.copy...
Florian Friedrich
1
@fried dalam kasus saya menambahkan paragrafty dengan jeda baris selain NSLineBreakByWordWrapping menyebabkan ukuran dihitung hanya untuk satu baris ... Ada pikiran?
manicaesar
9
Jangan lupa bahwa boundingRectWithSize:options:attributes:context:mengembalikan nilai fraksional. Yang perlu Anda lakukan ceil(textRect.size.height)dan ceil(textRect.size.width)masing - masing untuk mendapatkan tinggi / lebar sebenarnya.
Florian Friedrich
20
Apa yang BOLIVIASize?
JRam13
36

Karena kita tidak dapat menggunakan sizeWithAttributes untuk semua iOS yang lebih besar dari 4.3, kita harus menulis kode kondisional untuk 7.0 dan iOS sebelumnya.

1) Solusi 1:

if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
   CGSize size = CGSizeMake(230,9999);
   CGRect textRect = [specialityObj.name  
       boundingRectWithSize:size
                    options:NSStringDrawingUsesLineFragmentOrigin
                 attributes:@{NSFontAttributeName:[UIFont fontWithName:[AppHandlers zHandler].fontName size:14]}
                    context:nil];
   total_height = total_height + textRect.size.height;   
}
else {
   CGSize maximumLabelSize = CGSizeMake(230,9999); 
   expectedLabelSize = [specialityObj.name sizeWithFont:[UIFont fontWithName:[AppHandlers zHandler].fontName size:14] constrainedToSize:maximumLabelSize lineBreakMode:UILineBreakModeWordWrap]; //iOS 6 and previous. 
   total_height = total_height + expectedLabelSize.height;
}

2) Solusi 2

UILabel *gettingSizeLabel = [[UILabel alloc] init];
gettingSizeLabel.font = [UIFont fontWithName:[AppHandlers zHandler].fontName size:16]; // Your Font-style whatever you want to use.
gettingSizeLabel.text = @"YOUR TEXT HERE";
gettingSizeLabel.numberOfLines = 0;
CGSize maximumLabelSize = CGSizeMake(310, 9999); // this width will be as per your requirement

CGSize expectedSize = [gettingSizeLabel sizeThatFits:maximumLabelSize];

Solusi pertama adalah kadang gagal mengembalikan nilai ketinggian yang tepat. jadi gunakan solusi lain. yang akan bekerja dengan sempurna.

Opsi kedua cukup baik dan bekerja dengan lancar di semua iOS tanpa kode kondisional.

Nirav Jain
sumber
1
mengapa 230, 999? Di mana Anda mendapatkan nomor>
user4951
1
230 dapat berupa angka apa saja. Ini mewakili lebar yang Anda inginkan untuk label Anda. 9999 Saya lebih suka mengganti dengan INFINITY atau MAXFLOAT.
Florian Friedrich
Solusi kedua bekerja seperti pesona. Nirav terima kasih.
Jim
1
"[AppHandlers zHandler]" memberikan kesalahan .. "Undeclared Identifiers". Bagaimana mengatasinya?
Dimple
9

Inilah solusi sederhana:

Persyaratan :

CGSize maximumSize = CGSizeMake(widthHere, MAXFLOAT);
UIFont *font = [UIFont systemFontOfSize:sizeHere];

Sekarang Karena constrainedToSizeusage:lineBreakMode:penggunaan sudah tidak digunakan lagi di iOS 7.0 :

CGSize expectedSize = [stringHere sizeWithFont:font constrainedToSize:maximumSize lineBreakMode:NSLineBreakByWordWrapping];

Sekarang penggunaan dalam versi yang lebih besar dari iOS 7.0 adalah:

// Let's make an NSAttributedString first
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:stringHere];
//Add LineBreakMode
NSMutableParagraphStyle *paragraphStyle = [NSMutableParagraphStyle new];
[paragraphStyle setLineBreakMode:NSLineBreakByWordWrapping];
[attributedString setAttributes:@{NSParagraphStyleAttributeName:paragraphStyle} range:NSMakeRange(0, attributedString.length)];
// Add Font
[attributedString setAttributes:@{NSFontAttributeName:font} range:NSMakeRange(0, attributedString.length)];

//Now let's make the Bounding Rect
CGSize expectedSize = [attributedString boundingRectWithSize:maximumSize options:NSStringDrawingUsesLineFragmentOrigin context:nil].size;
Paresh Navadiya
sumber
7

Di bawah ini adalah dua metode sederhana yang akan menggantikan dua metode usang ini.

Dan berikut ini adalah referensi yang relevan:

Jika Anda menggunakan NSLineBreakByWordWrapping, Anda tidak perlu menentukan NSParagraphStyle, karena itu adalah default: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSParagraphStyle_Class/index. html # // apple_ref / occ / clm / NSParagraphStyle / defaultParagraphStyle

Anda harus mendapatkan langit-langit ukuran, agar sesuai dengan hasil metode yang sudah usang. https://developer.apple.com/library/ios/documentation/UIKit/Reference/NSString_UIKit_Additions/#//apple_ref/occ/instm/NSString/boundingRectWithSize:options:attributes : context :

+ (CGSize)text:(NSString*)text sizeWithFont:(UIFont*)font {    
    CGSize size = [text sizeWithAttributes:@{NSFontAttributeName: font}];
    return CGSizeMake(ceilf(size.width), ceilf(size.height));
}

+ (CGSize)text:(NSString*)text sizeWithFont:(UIFont*)font constrainedToSize:(CGSize)size{
    CGRect textRect = [text boundingRectWithSize:size
                                     options:NSStringDrawingUsesLineFragmentOrigin
                                  attributes:@{NSFontAttributeName: font}
                                     context:nil];
    return CGSizeMake(ceilf(textRect.size.width), ceilf(textRect.size.height));
}
Harris
sumber
6

Dalam kebanyakan kasus saya menggunakan metode sizeWithFont: constrainedToSize: lineBreakMode: untuk memperkirakan ukuran minimum untuk sebuah UILabel untuk mengakomodasi teksnya (terutama ketika label harus ditempatkan di dalam UITableViewCell) ...

... Jika ini persis situasi Anda, Anda dapat menggunakan metode ini:

CGSize size = [myLabel textRectForBounds:myLabel.frame limitedToNumberOfLines:mylabel.numberOfLines].size;

Semoga ini bisa membantu.

roberto.buratti
sumber
5
Dokumentasi Apple mengatakan bahwa Anda tidak boleh memanggil metode ini secara langsung.
Barlow Tucker
Setidaknya tidak disebutkan dalam dokumentasi iOS 7 SDK.
Rivera
3
UIFont *font = [UIFont boldSystemFontOfSize:16];
CGRect new = [string boundingRectWithSize:CGSizeMake(200, 300) options:NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName: font} context:nil];
CGSize stringSize= new.size;
pengguna3575114
sumber
3
Selamat datang di StackOverFlow. Jangan memposting jawaban yang sama lagi. Jika Anda perlu menambahkan sesuatu ke jawaban, buat komentar atau edit jawaban.
Ramaraj T
ok..saya akan mempertimbangkannya lain kali. Terima kasih atas saran Anda.
user3575114
2

[Jawaban yang diterima berfungsi dengan baik dalam suatu kategori. Saya menimpa nama metode yang sudah usang. Apakah ini ide yang bagus? Tampaknya berfungsi tanpa keluhan di Xcode 6.x]

Ini berfungsi jika Target Penempatan Anda adalah 7,0 atau lebih besar. Kategori adalahNSString (Util)

NSString + Util.h

- (CGSize)sizeWithFont:(UIFont *) font;
- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size;

NSString + Util.m

- (CGSize)sizeWithFont:(UIFont *) font {
    NSDictionary *fontAsAttributes = @{NSFontAttributeName:font};
    return [self sizeWithAttributes:fontAsAttributes];
}

- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size {
    NSDictionary *fontAsAttributes = @{NSFontAttributeName:font};
    CGRect retVal = [self boundingRectWithSize:size
                                     options:NSStringDrawingUsesLineFragmentOrigin
                                  attributes:fontAsAttributes context:nil];
    return retVal.size;
}
Dan Rosenstark
sumber
0
UIFont *font = [UIFont fontWithName:@"Courier" size:16.0f];

NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
paragraphStyle.lineBreakMode = NSLineBreakByTruncatingTail;
paragraphStyle.alignment = NSTextAlignmentRight;

NSDictionary *attributes = @{ NSFontAttributeName: font,
                    NSParagraphStyleAttributeName: paragraphStyle };

CGRect textRect = [text boundingRectWithSize:size
                                 options:NSStringDrawingUsesLineFragmentOrigin
                              attributes:attributes
                                 context:nil];

CGSize size = textRect.size;

dari dua jawaban 1 + 2

Alex
sumber