iOS 7 sizeWithAttributes : sizeWithFont : constrainedToSize 대체


132

새로운 iOS 7 메소드 sizeWithAttributes에서 여러 줄로 된 텍스트 CGSize를 어떻게 반환합니까?

sizeWithFont : constrainedToSize와 동일한 결과를 생성하고 싶습니다.

NSString *text = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus eu urna quis lacus imperdiet scelerisque a nec neque. Mauris eget feugiat augue, vitae porttitor mi. Curabitur vitae sollicitudin augue. Donec id sapien eros. Proin consequat tellus in vehicula sagittis. Morbi sed felis a nibh hendrerit hendrerit. Lorem ipsum dolor sit."

CGSize textSize = [text sizeWithAttributes:@{ NSFontAttributeName : [UIFont fontWithName:@"HelveticaNeue-Light" size:16.0] }];

이 방법은 한 줄의 텍스트에 대해서만 높이를 생성합니다.


: 이것 좀 봐 가지고 stackoverflow.com/questions/18673176/...

6
나와 같은 글꼴을 가진 +1 :)
Lescai Ionel

답변:


293

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

NSDictionary *attributes = @{NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue" size:14]};
// NSString class method: boundingRectWithSize:options:attributes:context is
// available only on ios7.0 sdk.
CGRect rect = [textToMeasure boundingRectWithSize:CGSizeMake(width, CGFLOAT_MAX)
                                          options:NSStringDrawingUsesLineFragmentOrigin
                                       attributes:attributes
                                          context:nil];

4
처음으로 나는 사전에 대한이 표기법을 참조하십시오 @{...}. 뭐라고 해요?
Martin Berger

4
브로, 난 거의 그렇게 믿지 않아서 여기 왔어요
NSPunk

21
와. 더 이상 sizeWithFont:constrainedToSize:사용되지 않는 원래 방법 보다 훨씬 더 애매합니다 . 애플은 정말로 우리를 미워해야한다. 어쨌든 +1.
aroth

1
MAXFLOAT대신에 사용 CGFLOAT_MAX합니까?
Julian F. Weinert

19
스위프트 버전 :var size = textToMeasure.boundingRectWithSize( CGSizeMake(width, CGFloat.max), options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes:attrs, context:nil).size
mdziadkowiec

23

이것이 내가 한 방법입니다.

    // Get a font to draw it in
UIFont *font = [UIFont boldSystemFontOfSize: 28];

CGRect textRect;
NSDictionary *attributes = @{NSFontAttributeName: font};

// How big is this string when drawn in this font?
textRect.size = [text sizeWithAttributes:attributes];

// Draw the string
[text drawInRect:textRect withAttributes:attributes];

2
긴 문자열이 줄 끝에서 끊어지면 작동하지 않습니다. elio.d의 답변을 참조하십시오.
Julian F. Weinert

4

스위프트 2.3 :

let attributes = [NSFontAttributeName:UIFont(name: "HelveticaNeue", size: 14)]
let rect = NSString(string: textToMeasure).boundingRectWithSize(
        CGSizeMake(width, CGFLOAT_MAX), 
        options: NSStringDrawingOptions.UsesLineFragmentOrigin, 
        attributes: attributes, context: nil)

스위프트 4 :

let attributes = [NSFontAttributeName:UIFont(name: "HelveticaNeue", size: 14)]
let rect = NSString(string: textToMeasure).boundingRect(
                    with: CGSize(width: width, height: CGFloat.greatestFiniteMagnitude),
                    options: NSStringDrawingOptions.usesLineFragmentOrigin,
                    attributes: attributes as [NSAttributedString.Key : Any], context: nil)

3

두 가지 상황을 모두 다루는 방법은 다음과 같습니다 NSString.

- (CGSize) sizeWithFontOrAttributes:(UIFont *) font {
    if (IS_IOS7) {
        NSDictionary *fontWithAttributes = @{NSFontAttributeName:font};
        return [self sizeWithAttributes:fontWithAttributes];
    } else {
        return [self sizeWithFont:font];
    }
}

3

Xamarin.iOS의 경우 :

UIFont descriptionLabelFont =  UIFont.SystemFontOfSize (11);
NSString textToMeasure = (NSString)DescriptionLabel.Text;

CGRect labelRect = textToMeasure.GetBoundingRect (
    new CGSize(this.Frame.Width, nfloat.MaxValue), 
    NSStringDrawingOptions.UsesLineFragmentOrigin, 
    new UIStringAttributes () { Font = descriptionLabelFont }, 
    new NSStringDrawingContext ()
);

2

텍스트, 글꼴, numberOfLines 및 레이블 너비를 설정 한 경우이 메소드는 레이블 크기를 반환합니다.

myLabel.numberOfLines = 0;

CGSize size = [myLabel sizeThatFits:CGSizeMake(myLabel.frame.size.width, CGFLOAT_MAX)];`

1

대안으로을보고 있다면 UITextView항상 다음 NSLayoutManager방법을 사용할 수 있습니다 .

CGSize textSize = [textView.layoutManager usedRectForTextContainer:textView.textContainer].size;

주어진 글꼴의 줄 높이는 다음과 같이 찾을 수도 있습니다.

UIFont *font;
CGFloat lineHeight = font.lineHeight;

0

[신규 사용자로서 @testing의 답변에 의견을 게시 할 수 없지만 (xamarin.ios의 경우) 그의 답변을보다 유용하게 만들 수 있습니다.]

CGRect를 반환하고 UIButton 등을 대상으로하는 gui 항목에 height 매개 변수 만 사용할 수 있습니다.

    public CGRect GetRectForString(String strMeasure, int fontSize, nfloat guiItemWidth)
    {
        UIFont descriptionLabelFont =  UIFont.SystemFontOfSize (fontSize);
        NSString textToMeasure = (NSString)strMeasure;

        CGRect labelRect = textToMeasure.GetBoundingRect (
            new CGSize(guiItemWidth, nfloat.MaxValue), 
            NSStringDrawingOptions.UsesLineFragmentOrigin, 
            new UIStringAttributes () { Font = descriptionLabelFont }, 
            new NSStringDrawingContext ()
        );

        return labelRect;
    }

        header_Revision.Frame = new CGRect (5
                                            , verticalAdjust
                                            , View.Frame.Width-10
                                            , GetRectForString( header_Revision.Title(UIControlState.Normal)
                                                              , 18
                                                              , View.Frame.Width-10 ).Height
                                            );

이것은 실제로 Xamarin.IOS에 대한 훌륭한 코드 테스트 중이라고 가정했습니다. :) 누군가에게 도움이되기를 바랍니다 :)
Matt

더 많은 담당자가 있으면 일반적으로 이와 같은 댓글이 게시물에 추가됩니다. 아직 그렇게 할 수 없으므로 추가 데이터에 감사하고 Stack Overflow에 오신 것을 환영합니다.
스튜어트 시글 러

0
CGSize stringsize = [lbl.text sizeWithAttributes:
                         @{NSFontAttributeName:[UIFont fontWithName:FontProximaNovaRegular size:12.0]}];


CGSize adjustedSize = CGSizeMake(ceilf(stringsize.width), ceilf(stringsize.height));

ceilf방법을 사용 하여 적절하게 관리

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