2013-09-16 50 views
6

Tôi đang cập nhật ứng dụng của mình lên iOS 7 và cuối cùng đã nhận được nó, nhưng có một điều tôi không thể tìm thấy giải pháp.sizeWithFont: constrainedToSize: lineBreakMode: không được chấp nhận trong iOS7

Trong Xcode 4 tôi đã sử dụng phương pháp sau đây:

#define FONT_SIZE 14.0f 
#define CELL_CONTENT_WIDTH 280.0f 
#define CELL_CONTENT_MARGIN 10.0f 


- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; { 
    NSString *text = [textA objectAtIndex:[indexPath row]]; 

    CGSize constraint = CGSizeMake(CELL_CONTENT_WIDTH - (CELL_CONTENT_MARGIN * 2), 20000.0f); 

    CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:FONT_SIZE] constrainedToSize:constraint lineBreakMode:NSLineBreakByWordWrapping]; 

    CGFloat height = MAX(size.height, 28.0f); 

    return height + (CELL_CONTENT_MARGIN * 2); 
} 

Nhưng tôi sẽ nhận được một lỗi khi sử dụng nó trong iOS 7:

Sử dụng -boundingRectWithSize: tùy chọn: thuộc tính: bối cảnh :

Tôi không biết cách chuyển đổi phiên bản cũ của mình sang phương pháp mới này và sẽ tuyệt vời nếu có ai đó có thể lp tôi. Cảm ơn trước.

Trả lời

5

sizeWithFont phương pháp đã được tán thành trong iOS7. Thay vào đó, bạn nên sử dụng boundingRectWithSize. Nếu bạn cũng cần phải hỗ trợ các phiên bản iOS trước sau đó bạn có thể sử dụng đoạn mã sau:

CGSize size = CGSizeZero; 

if ([label.text respondsToSelector: @selector(boundingRectWithSize:options:attributes:context:)] == YES) { 
    size = [label.text boundingRectWithSize: constrainedSize options: NSStringDrawingUsesLineFragmentOrigin 
           attributes: @{ NSFontAttributeName: label.font } context: nil].size; 
} else { 
    size = [label.text sizeWithFont: label.font constrainedToSize: constrainedSize lineBreakMode: UILineBreakModeWordWrap]; 
} 
2

API sizeWithFont bạn đang sử dụng không được chấp nhận trên iOS7.

// See UIStringDrawing.h 
- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(NSLineBreakMode)lineBreakMode NS_DEPRECATED_IOS(2_0, 7_0, "Use -boundingRectWithSize:options:attributes:context:"); // NSTextAlignment is not needed to determine size 

Bạn có thể sử dụng các gợi ý API như vậy:

NSMutableDictionary *atts = [[NSMutableDictionary alloc] init]; 
[atts setObject:myFont forKey:NSFontAttributeName]; 

CGRect rect = [myText boundingRectWithSize:constraint 
           options:NSStringDrawingUsesLineFragmentOrigin 
           attributes:atts 
           context:nil]; 
4

Nếu bạn chỉ hỗ trợ iOS6 và sau đó, bạn có thể chuyển đổi của bạn NSStrings để NSAttributedStrings và sử dụng NSAttributedString 's boundingRectWithSize:options:context:.

Cái gì đó trông như thế này trước đây:

CGSize size = [text sizeWithFont:font 
       constrainedToSize:(CGSize){maxWidth, CGFLOAT_MAX}]; 

thể dễ dàng chuyển đổi sang này và làm việc tại cả iOS6 và iOS7:

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

Là một lưu ý phụ, vì lợi ích của làm việc này cách là để kích thước văn bản của bạn trong ios6 bây giờ là thread-safe. Các phương pháp cũ của sizeWithFont:... thuộc về UIStringDrawing, lỗi này sẽ sụp đổ nếu bạn chạy sizeWithFont:... trên hai luồng cùng một lúc. Trong ios6, chức năng NSStringDrawing mới cho NSAttributedStrings bị phơi sáng và chức năng boundingRectWithSize:... là chủ đề an toàn. Tôi đoán đây là lý do tại sao trong ios7, các chức năng cũ sizeWithFont:... không được chấp nhận.

Xin lưu ý các tài liệu đề cập đến:

Trong iOS 7 và sau đó, phương pháp này trả về kích thước phân đoạn (trong thành phần kích thước của CGRect trả lại); để sử dụng kích thước trả về kích thước lượt xem, bạn phải sử dụng tăng giá trị của nó lên số nguyên cao nhất gần nhất bằng hàm ceil.

Vì vậy, để kéo ra chiều cao tính toán hoặc chiều rộng được sử dụng cho kích thước quan điểm, tôi sẽ sử dụng:

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