2013-12-16 15 views
8

tôi tạo ra một UITextView, thêm văn bản vào nó, và đặt nó trong giao diện (với một container)boundingRectWithSize không tôn trọng từ gói

UITextView *lyricView = [[UITextView alloc] initWithFrame:screen]; 
lyricView.text = [NSString stringWithFormat:@"\n\n%@\n\n\n\n\n\n", lyrics]; 
[container addSubview:lyricView]; 
[self.view addSubview:container]; 

sau đó tôi nhận được kích thước của nó để sử dụng với một nút và thêm nó vào UITextView

CGRect size = [lyrics boundingRectWithSize:CGSizeMake(lyricView.frame.size.width, MAXFLOAT) 
           options:NSStringDrawingUsesLineFragmentOrigin 
           attributes:@{NSFontAttributeName:[lyricView font]} 
           context:nil]; 
UIButton *doneButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
[doneButton setFrame:CGRectMake(56, size.size.height + 55, 208, 44)]; 
[doneButton setTitle:@"Done" forState:UIControlStateNormal]; 
[lyricView addSubview:doneButton]; 

này hoạt động trong hầu hết trường hợp . Điều này sẽ tôn trọng \ n ngắt dòng (như tôi đã thêm vào chuỗi của tôiWithFormat) nhưng nó sẽ không tôn trọng từ kết thúc tự động được thêm vào bởi khung nhìn văn bản. Vì vậy, nếu lyrics có một dòng không phù hợp trên màn hình, UITextView sẽ quấn nó (như nó phải), nhưng size bây giờ là hơi ngắn hơn nó nên được bởi vì nó không tôn trọng bọc xem văn bản.

+1

bạn đã thử thay thế 'NSStringDrawingUsesLineFragmentOrigin 'bởi' NSStringDrawingUsesFontLeading'? Mà ** Sử dụng phông chữ hàng đầu để tính chiều cao dòng ** – johnMa

+0

@johnMa Khi tôi sử dụng 'NSStringDrawingUsesFontLeading', nó sẽ trả về 0. Khi tôi sử dụng' NSStringDrawingUsesLineFragmentOrigin' hoặc cả hai , Tôi có vấn đề được mô tả ở trên. – vqdave

+0

Mọi cập nhật về điều này? Tôi đang gặp vấn đề tương tự và dường như không tìm được câu trả lời hay. –

Trả lời

2

Đã nghiên cứu thêm và kết thúc tìm kiếm this.

CGSize textSize = [textView sizeThatFits:CGSizeMake(textView.frame.size.width, FLT_MAX)]; 
CGFloat textHeight = textSize.height; 

Hy vọng điều này sẽ giúp ai đó ở ngoài đó!

+0

Điều này vẫn đang hoạt động cho bạn trong iOS 8? – fatuhoku

+0

Đúng, vẫn hoạt động trong iOS 8. @fatuhoku – vqdave

5

Bạn có thể yêu cầu boundingRectWithSize xử lý chuỗi ở chế độ gói từ. Bạn phải thêm thuộc tính NSParagraphStyle vào thông số thuộc tính, với số lineBreakMode được đặt thành NSLineBreakByWordWrapping. Vì vậy:

NSMutableDictionary *attr = [NSMutableDictionary dictionary];  
// ...whatever other attributes you need... 
NSMutableParagraphStyle *paraStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; 
paraStyle.lineBreakMode = NSLineBreakByWordWrapping; 
[attr setObject:paraStyle forKey:NSParagraphStyleAttributeName]; 

sau đó sử dụng attr như là đối số thuộc tính để boundingRectWithSize.

Bạn có thể dễ dàng mở rộng/khái quát hóa kỹ thuật này để đọc các thuộc tính khác bao gồm các thuộc tính kiểu đoạn hiện tại từ bất kỳ nguồn nào hợp lý.

+0

Không hoạt động với tôi ... :( –

+0

Điều này sẽ không hoạt động vì nó là mặc định – Daniel

3

Nên sử dụng (NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading) cho thông số options.

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