Nhiều phương pháp tôi đã sử dụng để xác định bố cục của chuỗi in để tạo tài liệu pdf phức tạp đã không được chấp nhận trong iOS7. Tài liệu các cuộc gọi ra cùng một phương pháp sử dụng để thay thế cho tất cả các phương pháp sizeWithFont được chấp nhận:Thay thế cho sizeWithFont: ForWidth: lineBreakMode:
boundingRectWithSize:options:attributes:
Đó là tốt cho sizeWithFont:ConstrainedTosize:lineBreakMode
nhưng những gì nếu tôi muốn chuỗi của tôi trên chỉ có một dòng? Tôi không biết phải sử dụng cái gì cho chiều cao tối đa nên tôi không có giao tiếp để chuyển thành giá trị cho tham số đầu tiên.
Dưới đây là những gì tôi có khi giới hạn ở một kích thước nhất định.
CGFloat maxHeightAllowable = _maxHeight;
CGSize issueTitleMaxSize = CGSizeMake(_issueListTitleColWidth - (kColumnMargin *2), maxHeightAllowable);
NSDictionary *issueTitleAttributes = [NSDictionary dictionaryWithObjectsAndKeys:_bodyFont, NSFontAttributeName, nil];
CGRect issueTitleRect = CGRectIntegral([issueTitleText boundingRectWithSize:issueTitleMaxSize options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:issueTitleAttributes context:nil]);
CGSize issueTitleSize = issueTitleRect.size;
Làm cách nào để sử dụng cùng phương pháp này nếu tôi không biết maxHeight, hoặc thực sự, chiều cao cho một dòng chính xác là những gì tôi đang cố gắng tìm ra?
Tôi thấy lý do tại sao họ đang thúc đẩy khả năng tương thích cho các chuỗi NSAttributed và bố cục tự động nhưng tại sao không dùng nữa? Trường hợp thay thế, trong trường hợp của tôi, bây giờ phải mất 4 hoặc 5 bước mà nó đã từng là 1 hoặc 2.
Sử dụng dòng Thuộc tính ánh sáng của phông chữ, theo đề xuất của Mr T, tôi đã thực hiện các phương pháp này trong một danh mục đơn giản hóa rất nhiều thay thế.
#import "NSString+SizingForPDF.h"
@implementation NSString (SizingForPDF)
-(CGSize)integralSizeWithFont:(UIFont *)font constrainedToSize:(CGSize)maxSize
{
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:font, NSFontAttributeName, nil];
CGRect rect = CGRectIntegral([self boundingRectWithSize:maxSize options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:attributes context:nil]);
return rect.size;
}
-(CGSize)integralSizeWithFont:(UIFont *)font maxWidth:(CGFloat)maxWidth numberOfLines:(NSInteger)lines
{
if (lines == 0) {
lines = 1;
}
NSDictionary *attributes = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName];
CGFloat height = font.lineHeight * lines;
CGSize maxsize = CGSizeMake(maxWidth, height);
CGRect rect = CGRectIntegral([self boundingRectWithSize:maxsize options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingTruncatesLastVisibleLine|NSStringDrawingUsesFontLeading attributes:attributes context:nil]);
return rect.size;
}
@end
phương pháp của bạn là khá nhiều giống như tôi, chỉ có tôi sử dụng vĩ mô CGRectIntegral để kiểm soát các giá trị cho số nguyên. Tôi không bao giờ nghĩ đến việc xem font cho chiều cao dòng. Đó là câu trả lời cho tôi. Tôi đã sử dụng nó để tạo một vài phương pháp mới trong một danh mục dễ dàng thay thế mã cũ của tôi. –
LineBreakMode được thay thế bằng thuộc tính NSParagraphStyle có thể được thêm vào từ điển thuộc tính. Xem http://stackoverflow.com/a/26894770/338468 để biết ví dụ chi tiết về cách thực hiện việc này. –