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.