더 이상 사용되지 않는 -sizeWithFont : constrainedToSize : lineBreakMode :를 iOS 7에서 대체 하시겠습니까?


146

iOS 7에서 방법은 다음과 같습니다.

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

그리고 방법 :

- (CGSize)sizeWithFont:(UIFont *)font

더 이상 사용되지 않습니다. 교체하는 방법

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

과:

CGSize size = [string sizeWithFont:font];

2
대체 방법은 -sizeWithAttributes:입니다.
holex

네 홀 렉스 감사하지만 NSDIctionary와 같은 레이블의 글꼴을 어떻게 사용할 수 있습니까? 내 코드가 다음과 같은 경우 : sizeWithFont : customlabel.font; void ask "sizeWithAttributes : <# (NSDictionary *) #>"
user_Dennis_Mostajo

1
다음은 속성을 정의하는 방법에 대한 공식 문서입니다. developer.apple.com/library/ios/documentation/UIKit/Reference/…
holex

답변:


219

당신은 이것을 시도 할 수 있습니다 :

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

CGSize size = textRect.size;

"[UIFont font ....]"에 대해 "FONT"를 변경하십시오.


13
그리고 NSLineBreakByWordWrapping은 어디에 언급되어 있습니까? 어디로 갔습니까?
user4951

32
NSLineBreakByWordWrapping안에 갈 것입니다 NSParagraphStyle. 그래서 예를 들면 : NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping;속성에서 당신은 추가해야합니다 NSParagraphStyleAttributeName: paragraphStyle.copy...
플로리안 프리드리히에게

1
내 경우에는 NSLineBreakByWordWrapping 이외의 줄 바꿈과 함께 단락 스타일을 추가하면 한 줄에 대해서만 크기가 계산됩니다 ... 어떤 생각?
manicaesar

9
boundingRectWithSize:options:attributes:context:분수 값 을 반환 한다는 것을 잊지 마십시오 . 실제 높이 / 너비를 얻으려면 각각 ceil(textRect.size.height)및 작업을 수행해야합니다 ceil(textRect.size.width).
Florian Friedrich

20
도대체 BOLIVIASize는 무엇입니까?
JRam13

36

4.3보다 큰 모든 iOS에 sizeWithAttributes를 사용할 수 없으므로 7.0 및 이전 iOS에 대한 조건부 코드를 작성해야합니다.

1) 해결책 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) 해결책 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];

첫 번째 해결책은 때때로 적절한 높이 값을 반환하지 못하는 것입니다. 다른 솔루션을 사용하십시오. 완벽하게 작동합니다.

두 번째 옵션은 조건부 코드없이 모든 iOS에서 원활하게 작동합니다.


1
왜 230, 999? 당신이 번호를받을 수 있나요>
user4951

1
230은 숫자가 될 수 있습니다. 레이블에 원하는 너비를 나타냅니다. 9999는 오히려 INFINITY 또는 MAXFLOAT로 대체하고 싶습니다.
Florian Friedrich

두 번째 해결책은 매력처럼 작동합니다. 감사합니다 Nirav.
Jim

1
"[AppHandlers zHandler]"에 오류가 발생했습니다. "선언되지 않은 식별자". 그것을 해결하는 방법?
딤플

9

간단한 해결책은 다음과 같습니다.

요구 사항 :

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

이제 iOS 7.0constrainedToSizeusage:lineBreakMode: 에서는 사용법이 더 이상 사용되지 않습니다 .

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

이제 더 큰 iOS 7.0 버전에서의 사용법 은 다음과 같습니다.

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

다음은 사용되지 않는 두 가지 방법을 대체 할 간단한 두 가지 방법입니다.

관련 참조는 다음과 같습니다.

NSLineBreakByWordWrapping을 사용하는 경우 NSParagraphStyle을 기본값으로 지정할 필요가 없습니다. https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSParagraphStyle_Class/index. html # // apple_ref / occ / clm / NSParagraphStyle / defaultParagraphStyle

더 이상 사용되지 않는 메소드의 결과와 일치하도록 크기의 천장을 가져와야합니다. 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

대부분의 경우 sizeWithFont : constrainedToSize : lineBreakMode : 메소드를 사용하여 UILabel 이 텍스트 를 수용 할 수있는 최소 크기를 추정했습니다 (특히 레이블을 UITableViewCell 안에 배치해야하는 경우).

... 정확한 상황 이라면이 방법을 간단하게 사용할 수 있습니다.

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

이것이 도움이되기를 바랍니다.


5
Apple의 문서에 따르면이 메서드를 직접 호출하면 안됩니다.
Barlow Tucker

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;

3
StackOverFlow에 오신 것을 환영합니다. 같은 답변을 다시 게시하지 마십시오. 답변에 무언가를 추가해야하는 경우 의견을 작성하거나 답변을 편집하십시오.
Ramaraj T

알겠습니다. 다음에 고려하겠습니다. 조언 해 주셔서 감사합니다.
user3575114

2

[허용 된 답변은 카테고리에서 훌륭하게 작동합니다. 더 이상 사용되지 않는 메소드 이름을 덮어 쓰고 있습니다. 이것이 좋은 생각입니까? Xcode 6.x에서 불만없이 작동하는 것 같습니다]

배포 대상이 7.0 이상인 경우 작동합니다. 카테고리는NSString (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;
}

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;

두 답변에서 1 + 2

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.