Kullanımdan kaldırılmış -sizeWithFont: constrainedToSize: lineBreakMode: iOS 7'de mi?


146

İOS 7'de yöntem:

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

ve yöntem:

- (CGSize)sizeWithFont:(UIFont *)font

kullanımdan kaldırıldı. Nasıl değiştirebilirim

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

ve:

CGSize size = [string sizeWithFont:font];

2
ikame yöntem -sizeWithAttributes:.
holex

ok holex teşekkürler ama NSDIctionary gibi bir etiketten bir yazı tipini nasıl kullanabilirim? eğer kodum şöyle ise: sizeWithFont: customlabel.font; boşluk "sizeWithAttributes: <# (NSDictionary *) #>"
user_Dennis_Mostajo

1
öznitelikleri nasıl tanımlayabileceğinizle ilgili resmi belgeler: developer.apple.com/library/ios/documentation/UIKit/Reference/…
holex

Yanıtlar:


219

Bunu deneyebilirsin:

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

CGSize size = textRect.size;

"FONT" u "[UIFont yazı tipi ....]" için değiştirmeniz yeterlidir


13
Ve NSLineBreakByWordWrapping'den nerede bahsediyorsunuz? Nereye gitti?
user4951

32
NSLineBreakByWordWrappingbir NSParagraphStyle. Örneğin: NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping;Niteliklerde şunu eklemeniz gerekir NSParagraphStyleAttributeName: paragraphStyle.copy...
Florian Friedrich

1
@ffried benim durumumda paragrafStyle'ın NSLineBreakByWordWrapping dışında satır sonu ile eklenmesi boyutun sadece bir satır için hesaplanmasına neden oldu… Herhangi bir fikriniz var mı?
manicaesar

9
boundingRectWithSize:options:attributes:context:Kesirli değerleri döndürdüğünü unutmayın . Yapmanız gereken ceil(textRect.size.height)ve ceil(textRect.size.width)gerçek yükseklik / genişlik almak için sırasıyla.
Florian Friedrich

20
BOLIVIASize ne halt ediyor?
JRam13

36

4.3'ten büyük tüm iOS'lar için sizeWithAttributes kullanamadığımızdan, 7.0 ve önceki iOS için koşullu kod yazmamız gerekiyor.

1) Çözüm 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) Çözüm 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];

İlk çözüm bazen uygun yükseklik değerini döndürmede başarısız olmaktır. bu yüzden başka bir çözüm kullanın. mükemmel çalışacak.

İkinci seçenek oldukça iyi ve koşullu kod olmadan tüm iOS'ta sorunsuz çalışıyor.


1
neden 230, 999? Numarayı nereden alıyorsunuz>
user4951

1
230 herhangi bir sayı olabilir. Etiketiniz için istediğiniz genişliği temsil eder. 9999'u INFINITY veya MAXFLOAT ile değiştirmeyi tercih ederim.
Florian Friedrich

İkinci çözüm bir cazibe gibi çalışıyor. Teşekkürler Nirav.
Jim

1
"[AppHandlers zHandler]" bir hata veriyor .. "Belirtilmemiş Tanımlayıcılar". Bunu nasıl çözebilirim?
Dimple

9

İşte basit çözüm:

Gereksinimler :

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

Artık iOS 7.0'daconstrainedToSizeusage:lineBreakMode: kullanım kullanımdan kaldırıldığı için :

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

Artık iOS 7.0'ın daha büyük sürümünde kullanım şu şekilde olacaktır:

// 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;

7

Aşağıda, bu iki kullanımdan kaldırılmış yöntemin yerini alacak iki basit yöntem bulunmaktadır.

Ve işte ilgili referanslar:

NSLineBreakByWordWrapping kullanıyorsanız, varsayılan olduğundan NSParagraphStyle'ı belirtmeniz gerekmez: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSParagraphStyle_Class/index. html # // apple_ref / occ / clm / NSParagraphStyle / defaultParagraphStyle

Kullanımdan kaldırılan yöntemlerin sonuçlarına uyması için boyutun tavan değerini almalısınız. 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));
}

6

Çoğu durumda sizeWithFont: constrainedToSize: lineBreakMode yöntemini kullandım: bir UILabel'in metnini barındırması için minimum boyutu tahmin etmek için (özellikle etiketin bir UITableViewCell içine yerleştirilmesi gerektiğinde) ...

... Eğer durumunuz tam olarak buysa, şu yöntemi kullanabilirsiniz:

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

Umarım bu yardımcı olabilir.


5
Apple'ın belgeleri, bu yöntemi doğrudan aramamanız gerektiğini söylüyor.
Barlow Tucker

En azından iOS 7 SDK belgelerinde bahsedilmemiştir.
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;

3
StackOverFlow'a hoş geldiniz. Aynı cevabı tekrar göndermeyin. Bir yanıta bir şey eklemeniz gerekirse, bir yorum yapın veya yanıtı düzenleyin.
Ramaraj T

Tamam .. Bunu bir dahaki sefere dikkate alacağım. Tavsiyen için teşekkürler.
user3575114

2

[Kabul edilen yanıt, bir kategoride iyi çalışıyor. Kullanımdan kaldırılan yöntem adlarının üzerine yazıyorum. Bu iyi bir fikir mi? Xcode 6.x'te herhangi bir şikayet olmadan çalışıyor gibi görünüyor]

Bu, Dağıtım Hedefiniz 7.0 veya üzeriyse çalışır. KategoriNSString (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;
}

1
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;

iki cevaptan 1 + 2

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.