Kích thước iOS 7WithAttribut: thay thế cho sizeWithFont: ràng buộcToSize


132

Làm thế nào để bạn trả lại một văn bản nhiều dòng CGSize từ phương thức iOS 7 mới sizeWithAttribution?

Tôi muốn điều này tạo ra kết quả tương tự như sizeWithFont: ràng buộcToSize.

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] }];

Phương pháp này chỉ tạo ra chiều cao cho một dòng văn bản.



6
+1 vì có cùng phông chữ với tôi :)
Lescai Ionel

Câu trả lời:


293

tốt, bạn có thể thử điều này:

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
Lần đầu tiên tôi thấy ký hiệu này cho từ điển @{...}. Đó là những gì được gọi là?
Martin Berger

4
Bro, tôi gần như mất niềm tin vào SO, sau đó tôi đến đây.
NSPunk

21
Ồ Vì vậy, khó hiểu hơn nhiều so với sizeWithFont:constrainedToSize:phương pháp ban đầu đã bị phản đối. Apple phải thực sự ghét chúng tôi. Trong mọi trường hợp, +1.
aroth

1
Tại sao bạn sử dụng MAXFLOATthay vì CGFLOAT_MAX?
Julian F. Weinert

19
Phiên bản Swift:var size = textToMeasure.boundingRectWithSize( CGSizeMake(width, CGFloat.max), options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes:attrs, context:nil).size
mdziadkowiec

23

Đây là cách tôi đã làm nó:

    // 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
Điều này sẽ không hoạt động nếu một chuỗi dài sẽ bị đứt ở cuối dòng. Tham khảo câu trả lời của elio.d, đúng.
Julian F. Weinert

4

Swift 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)

Swift 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

Đây là phương pháp của tôi để đối phó với cả hai tình huống, đi vào một NSStringdanh mục.

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

3

Đối với 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

Nếu bạn có văn bản, phông chữ, numberOfLines và chiều rộng của bộ nhãn, phương thức này trả về kích thước nhãn của bạn:

myLabel.numberOfLines = 0;

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

1

Thay vào đó, nếu bạn đang xem UITextView, bạn luôn có thể sử dụng NSLayoutManagerphương pháp:

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

Bạn cũng có thể tìm chiều cao dòng cho một phông chữ nhất định bằng cách:

UIFont *font;
CGFloat lineHeight = font.lineHeight;

0

[Là người dùng mới, tôi không thể đăng nhận xét cho câu trả lời của @ tests, nhưng để làm cho câu trả lời của anh ấy (cho xamarin.ios) hữu ích hơn]

Chúng tôi có thể trả về CGRect và chỉ sử dụng tham số chiều cao cho mục gui mà chúng tôi đang nhắm mục tiêu UIButton, v.v.Đăng ký trong bất kỳ tham số nào chúng tôi cần như dưới đây

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

Điều này thực sự được cho là đang được thử nghiệm mã đẹp cho Xamarin.IOS :) Hy vọng nó sẽ giúp được bất cứ ai :)
Matt

Khi bạn có nhiều đại diện hơn, một bình luận như thế này thường sẽ được thêm vào bài viết. Bạn chưa thể làm điều đó, vì vậy cảm ơn về dữ liệu bổ sung và chào mừng bạn đến với Stack Overflow.
Stuart Siegler

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


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

sử dụng ceilfphương pháp để quản lý đúng cách

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.