2010-04-19 13 views
27

A "quicky": làm thế nào tôi có thể nhận được kích thước (chiều rộng) của một NSString?Cách lấy kích thước của NSString

Tôi đang cố gắng xem liệu chiều rộng chuỗi của chuỗi có lớn hơn chiều rộng màn hình đã cho hay không, trong trường hợp tôi phải "cắt" và thêm nó bằng "...", nhận được hành vi thông thường của một UILabel. string.length sẽ không thực hiện thủ thuật vì AAAAAAAA và iiiiii có cùng chiều dài nhưng kích thước khác nhau (ví dụ).

Tôi bị kẹt.

Cảm ơn rất nhiều.

Trả lời

38

Đây là một cách tiếp cận khác. Tìm hiểu kích thước tối thiểu của văn bản để nó không bị quấn nhiều hơn một dòng. Nếu nó kết thúc tốt đẹp trên một dòng, bạn có thể tìm hiểu bằng cách sử dụng chiều cao.

Bạn có thể sử dụng mã này:

CGSize maximumSize = CGSizeMake(300, 9999); 
NSString *myString = @"This is a long string which wraps"; 
UIFont *myFont = [UIFont fontWithName:@"Helvetica" size:14]; 
CGSize myStringSize = [myString sizeWithFont:myFont 
          constrainedToSize:maximumSize 
           lineBreakMode:self.myLabel.lineBreakMode]; 

300 là chiều rộng của màn hình với một không gian nhỏ cho lợi nhuận. Bạn nên thay thế các giá trị của riêng bạn cho phông chữ và kích thước, và cho lineBreakMode nếu bạn không sử dụng IB.

Bây giờ myStringSize sẽ chứa height mà bạn có thể kiểm tra theo chiều cao của nội dung bạn biết chỉ cao 1 dòng (sử dụng cùng một phông chữ và kích thước). Nếu nó lớn hơn, bạn sẽ cần phải cắt văn bản. Lưu ý rằng bạn nên thêm một ... vào chuỗi trước khi bạn kiểm tra lại (thêm ... có thể đẩy nó vượt quá giới hạn một lần nữa).

Đặt mã này trong vòng lặp để cắt văn bản, sau đó kiểm tra lại với chiều cao chính xác.

+0

Cảm ơn rất nhiều! Câu trả lời của bạn là chính xác và mẹo để thêm "..." trước khi kiểm tra kích thước lại là khôn ngoan. – camilo

+5

Đối với iOS 7, bạn nên kiểm tra [câu trả lời này] (http://stackoverflow.com/a/18951386/3965) –

+1

nó không được chấp nhận sau ios7, bạn nên sử dụng boundingRectWithSize: .. – 7heaven

4

Bạn cần sử dụng Đồ họa cốt lõi để đo chuỗi, như được hiển thị trong phông chữ và kích thước được chỉ định của bạn. Xem câu trả lời cho Measuring the pixel width of a string để được hướng dẫn.

+0

Câu trả lời của neva đã làm điều đó. . – camilo

10

Sử dụng phương thức bên dưới.

Objective-C

- (CGSize)findHeightForText:(NSString *)text havingWidth:(CGFloat)widthValue andFont:(UIFont *)font { 
    CGSize size = CGSizeZero; 
    if (text) { 
     CGRect frame = [text boundingRectWithSize:CGSizeMake(widthValue, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName:font } context:nil]; 
     size = CGSizeMake(frame.size.width, frame.size.height + 1); 
    } 
    return size; 
} 

Swift 3,0

func findHeight(forText text: String, havingWidth widthValue: CGFloat, andFont font: UIFont) -> CGSize { 
    var size = CGSizeZero 
    if text { 
     var frame = text.boundingRect(withSize: CGSize(width: widthValue, height: CGFLOAT_MAX), options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil) 
     size = CGSize(width: frame.size.width, height: frame.size.height + 1) 
    } 
    return size 
} 
+0

Tại sao chiều cao + 1? –

+0

'size = CGSize (chiều rộng: ceilf (frame.width), chiều cao: ceilf (frame.height))' là tốt hơn. –

+0

Câu hỏi đặt ra là hỏi cách lấy chiều rộng của chuỗi.Câu trả lời này là làm thế nào để có được chiều cao của chuỗi nếu bạn đã biết chiều rộng của nó ... thông tin tốt nhưng không phải là câu trả lời cho câu hỏi. Tôi nghĩ cách tiếp cận tốt hơn để đưa ra câu trả lời này là đặt câu hỏi đúng và sau đó trả lời câu hỏi đó, tiếp theo với một nhận xét có thể cho câu hỏi này chỉ cho bạn câu hỏi liên quan. – mah

2
sizeWithFont:constrainedToSize:lineBreakMode 

bị phản đối ngay bây giờ. Sử dụng đoạn mã bên dưới,

UIFont *font=[UIFont fontWithName:@"Arial" size:16.f]; 

NSString *name = @"APPLE"; 

CGSize size = [name sizeWithAttributes:@{NSFontAttributeName:font}];