2010-02-15 34 views
6

Trong UILabel, có chức năng cắt nhãn bằng cách sử dụng các kỹ thuật cắt ngắn khác nhau (UILineBreakMode). Trong NSString UIKit Additions có chức năng tương tự để vẽ các chuỗi.Làm thế nào để cắt bớt một NSString dựa trên chiều rộng đồ họa?

Tuy nhiên, tôi không tìm thấy cách nào để truy cập chuỗi bị cắt ngắn thực tế. Có cách nào khác để có được một chuỗi cắt ngắn dựa trên chiều rộng (đồ họa) cho một phông chữ nhất định không?

Tôi muốn có một danh mục trên NSString với phương pháp này:

-(NSString*)stringByTruncatingStringWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode 

Trả lời

6

Một lựa chọn đang cố gắng kích cỡ khác nhau bằng vòng lặp cho đến khi bạn có được chiều rộng đúng. I E. bắt đầu với chuỗi đầy đủ, nếu đó là rộng hơn những gì bạn cần, hãy thay thế hai ký tự cuối cùng bằng ký tự dấu chấm lửng. Lặp lại cho đến khi đủ hẹp.

Nếu bạn nghĩ bạn sẽ làm việc với các chuỗi dài, bạn có thể tìm kiếm theo cách nhị phân theo cách của bạn hướng tới điểm cắt ngắn để làm cho nó nhanh hơn một chút.

+0

Cảm ơn Uli, ý tưởng hay. Làm việc như một say mê. Xem mã trong nhận xét khác. –

17
- (NSString*)stringByTruncatingStringWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode { 
    NSMutableString *resultString = [[self mutableCopy] autorelease]; 
    NSRange range = {resultString.length-1, 1}; 

    while ([resultString boundingRectWithSize:CGSizeMake(FLT_MAX, FLT_MAX) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:attributes context:nil].size.width > width) { 
     // delete the last character 
     [resultString deleteCharactersInRange:range]; 
     range.location--; 
     // replace the last but one character with an ellipsis 
     [resultString replaceCharactersInRange:range withString:truncateReplacementString]; 
    } 
    return resultString; 
} 

Lưu ý rằng vì iOS 6 phương pháp này không an toàn để chạy trên các chủ đề nền nữa.

+0

Có lẽ, nên được cập nhật với phương pháp iOS - boundingRectWithSize: tùy chọn: thuộc tính: context :, do không dùng nữa. – skyylex

+0

@skyylex thực sự. Làm xong. –

Các vấn đề liên quan