[objective-c] iOS 7에서 더 이상 사용되지 않는 크기로 대체 :

iOS 7에서는 sizeWithFont:더 이상 사용되지 않습니다. UIFont 객체를 대체 방법으로 전달하려면 어떻게해야 sizeWithAttributes:합니까?



답변

sizeWithAttributes:대신을 사용하십시오 NSDictionary. 키 UITextAttributeFont와 글꼴 객체 쌍을 다음과 같이 전달하십시오.

CGSize size = [string sizeWithAttributes:
    @{NSFontAttributeName: [UIFont systemFontOfSize:17.0f]}];

// Values are fractional -- you should take the ceilf to get equivalent values
CGSize adjustedSize = CGSizeMake(ceilf(size.width), ceilf(size.height));


답변

일련의 NSString+UIKit함수 ( sizewithFont:...등)가 UIStringDrawing라이브러리를 기반으로 했기 때문에 함수가 더 이상 사용되지 않는다고 생각합니다.이 라이브러리는 스레드 안전하지 않습니다. 메인 스레드에서 다른 UIKit기능 과 달리 실행하지 않으면 예기치 않은 동작이 발생합니다. 특히 여러 스레드에서 동시에 함수를 실행하면 앱이 중단 될 수 있습니다. 이것이 iOS 6에서에 대한 boundingRectWithSize:...방법을 도입 한 이유 입니다 NSAttributedString. 이것은 NSStringDrawing라이브러리 위에 구축되었으며 스레드로부터 안전합니다.

NSString boundingRectWithSize:...함수 를 보면 a와 같은 방식으로 속성 배열을 요청합니다 NSAttributeString. 내가 추측해야한다면, NSStringiOS 7의 새로운 NSAttributeString기능은 iOS 6 의 기능에 대한 래퍼 일뿐 입니다.

참고로 iOS 6 및 iOS 7 만 지원하는 경우 모든 것을로 변경 NSString sizeWithFont:...합니다 NSAttributeString boundingRectWithSize. 이상한 멀티 스레딩 코너 케이스가 발생하면 두통을 많이 피할 수 있습니다! 내가 변환 한 방법은 다음과 같습니다 NSString sizeWithFont:constrainedToSize:.

예전의 것 :

NSString *text = ...;
CGFloat width = ...;
UIFont *font = ...;
CGSize size = [text sizeWithFont:font 
               constrainedToSize:(CGSize){width, CGFLOAT_MAX}];

다음으로 대체 할 수 있습니다.

NSString *text = ...;
CGFloat width = ...;
UIFont *font = ...;
NSAttributedString *attributedText =
    [[NSAttributedString alloc] initWithString:text 
                                    attributes:@{NSFontAttributeName: font}];
CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX}
                                           options:NSStringDrawingUsesLineFragmentOrigin
                                           context:nil];
CGSize size = rect.size;

설명서에 언급 된 사항에 유의하십시오.

iOS 7 이상에서이 메소드는 소수 크기를 리턴합니다 (리턴 된 크기 구성 요소에서 CGRect). 리턴 된 크기를 사용하여 크기를보기 위해서는 ceil 함수를 사용하여 가장 큰 정수로 값을 올리십시오.

따라서 크기 조정 뷰에 사용할 계산 된 높이 또는 너비를 꺼내려면 다음을 사용합니다.

CGFloat height = ceilf(size.height);
CGFloat width  = ceilf(size.width);


답변

sizeWithFontApple 개발자 사이트에서 볼 수 있듯이 더 이상 사용되지 않으므로를 사용해야 sizeWithAttributes합니다.

#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)

NSString *text = @"Hello iOS 7.0";
if (SYSTEM_VERSION_LESS_THAN(@"7.0")) {
    // code here for iOS 5.0,6.0 and so on
    CGSize fontSize = [text sizeWithFont:[UIFont fontWithName:@"Helvetica" 
                                                         size:12]];
} else {
    // code here for iOS 7.0
   CGSize fontSize = [text sizeWithAttributes: 
                            @{NSFontAttributeName: 
                              [UIFont fontWithName:@"Helvetica" size:12]}];
}


답변

이 문제를 처리하기 위해 카테고리를 만들었습니다.

#import "NSString+StringSizeWithFont.h"

@implementation NSString (StringSizeWithFont)

- (CGSize) sizeWithMyFont:(UIFont *)fontToUse
{
    if ([self respondsToSelector:@selector(sizeWithAttributes:)])
    {
        NSDictionary* attribs = @{NSFontAttributeName:fontToUse};
        return ([self sizeWithAttributes:attribs]);
    }
    return ([self sizeWithFont:fontToUse]);
}

이 방법으로 당신은 찾기 / 바꾸기 만하면 sizeWithFont:됩니다 sizeWithMyFont:.


답변

iOS7에서는 tableview : heightForRowAtIndexPath 메서드에 올바른 높이를 반환하는 논리가 필요했지만 sizeWithAttributes는 고정 너비 테이블 셀에 넣을지 모르기 때문에 문자열 길이에 관계없이 항상 같은 높이를 반환합니다. . 나는 이것이 나를 위해 잘 작동하고 테이블 셀의 너비를 고려하여 올바른 높이를 계산한다는 것을 알았습니다! 위의 T 씨의 답변을 바탕으로합니다.

NSString *text = @"The text that I want to wrap in a table cell."

CGFloat width = tableView.frame.size.width - 15 - 30 - 15;  //tableView width - left border width - accessory indicator - right border width
UIFont *font = [UIFont systemFontOfSize:17];
NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:@{NSFontAttributeName: font}];
CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX}
                                           options:NSStringDrawingUsesLineFragmentOrigin
                                           context:nil];
CGSize size = rect.size;
size.height = ceilf(size.height);
size.width  = ceilf(size.width);
return size.height + 15;  //Add a little more padding for big thumbs and the detailText label


답변

동적 높이를 사용하는 여러 줄 레이블은 크기를 올바르게 설정하기 위해 추가 정보가 필요할 수 있습니다. UIFont 및 NSParagraphStyle과 함께 sizeWithAttributes를 사용하여 글꼴과 줄 바꿈 모드를 모두 지정할 수 있습니다.

단락 스타일을 정의하고 다음과 같이 NSDictionary를 사용합니다.

// set paragraph style
NSMutableParagraphStyle *style = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
[style setLineBreakMode:NSLineBreakByWordWrapping];
// make dictionary of attributes with paragraph style
NSDictionary *sizeAttributes        = @{NSFontAttributeName:myLabel.font, NSParagraphStyleAttributeName: style};
// get the CGSize
CGSize adjustedSize = CGSizeMake(label.frame.size.width, CGFLOAT_MAX);

// alternatively you can also get a CGRect to determine height
CGRect rect = [myLabel.text boundingRectWithSize:adjustedSize
                                                         options:NSStringDrawingUsesLineFragmentOrigin
                                                      attributes:sizeAttributes
                                                         context:nil];

높이를 찾고 있다면 CGSize ‘adjustedSize’또는 CGRect를 rect.size.height 속성으로 사용할 수 있습니다.

NSParagraphStyle에 대한 자세한 내용은 여기 ( https://developer.apple.com/library/mac/documentation/cocoa/reference/applicationkit/classes/NSParagraphStyle_Class/Reference/Reference.html)를 참조 하십시오.


답변

// max size constraint
CGSize maximumLabelSize = CGSizeMake(184, FLT_MAX)

// font
UIFont *font = [UIFont fontWithName:TRADE_GOTHIC_REGULAR size:20.0f];

// set paragraph style
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping;

// dictionary of attributes
NSDictionary *attributes = @{NSFontAttributeName:font,
                             NSParagraphStyleAttributeName: paragraphStyle.copy};

CGRect textRect = [string boundingRectWithSize: maximumLabelSize
                                     options:NSStringDrawingUsesLineFragmentOrigin
                                  attributes:attributes
                                     context:nil];

CGSize expectedLabelSize = CGSizeMake(ceil(textRect.size.width), ceil(textRect.size.height));