2014-05-10 14 views
9

Tôi có thể gắn UITextView không cuộn được trong một UIScrollView và thêm văn bản vào UITextView động. Các UIScrollView điều chỉnh nội dung của nóKích thước phù hợp dựa trên khung của TextView. Tuy nhiên, khi UITextView vượt quá chiều cao 8192, văn bản sẽ trở nên vô hình (nhưng vẫn ở đó, vì bạn có thể sử dụng kính lúp để đánh dấu văn bản và thậm chí xem các phần của văn bản qua kính lúp). chức năngVăn bản UITextView trở nên vô hình sau khi chiều cao đạt 8192.0

CGRect textviewFrame = self.TextView.frame; 
    textviewFrame.size.height = [self textViewHeightForAttributedText:self.TextView.attributedText andWidth:320.0]; 
    self.TextView.frame = textviewFrame; 
    self.ScrollView.contentSize = self.TextView.frame.size; 

Helper để kích thước phù hợp UITextView:

- (CGFloat)textViewHeightForAttributedText:(NSAttributedString *)text andWidth:(CGFloat)width 
{ 
    UITextView *textView = [[UITextView alloc] init]; 
    [textView setAttributedText:text]; 
    CGSize size = [textView sizeThatFits:CGSizeMake(width, FLT_MAX)]; 
    return size.height; 
} 

đã không nhận ra nó là vấn đề chính xác cùng đó là chưa được giải quyết here cho đến khi tôi kiểm tra nó ra một cách rõ ràng bằng cách buộc các kích thước tối đa đến 8193 và đã xảy ra sự cố (trong khi kích thước tối đa 8192 vẫn hiển thị văn bản chính xác). Bất cứ ai chạy vào vấn đề này trước và biết một công việc xung quanh? Cảm ơn

+0

Vấn đề không phải là văn bản biến mất. Vấn đề là chiều cao của chế độ xem văn bản. Điều này nghe có vẻ như một lỗi thực hiện chính. Làm việc xung quanh mạnh mẽ phụ thuộc vào các chi tiết của giao diện người dùng của bạn. – dasdom

+0

Trông giống như một lỗi, các điều khiển không nên hoạt động như thế. Vui lòng gửi báo cáo lỗi cho Apple. –

+0

@dasdom Thông tin chi tiết về giao diện người dùng của tôi sẽ hữu ích cho bạn? Về cơ bản bất cứ khi nào người dùng cuộn xuống dưới cùng của UIScrollView, nhiều văn bản được thêm vào UITextView và contentSize của UIScrollView được cập nhật. Điều này đang xảy ra trong phương thức scrollViewDidChange – SimplyLearning

Trả lời

3

Gần đây, tôi đã gặp sự cố này và đã tìm ra cách hiệu quả xung quanh vấn đề này. Mặc dù nó có vẻ như một lỗi iOS IMHO nó thực sự không ... có giới hạn thực tế để kích thước CALayer, cộng với vẽ một mảnh cao 8K của văn bản mất một thời gian dài. Tốt hơn nhiều để làm như Apple dự định và chỉ hiển thị các bit của văn bản đó là có thể nhìn thấy ... đó là lý do tại sao UITextView mở rộng UIScrollView sau khi tất cả.

Vấn đề là UITextView không dễ dàng tích hợp với các bit giao diện người dùng khác. Trong trường hợp của tôi, tôi đang làm việc trên một ứng dụng tin tức trong đó một UITextView đơn được sử dụng để hiển thị bài viết, cộng với một số giao diện người dùng riêng biệt (tiêu đề và nút vv) ở trên và dưới nó, tất cả được lưu trữ trong một vùng chứa có thể cuộn.

Giải pháp mà tôi tìm thấy là chia UITextView thành hai chế độ xem ... một vùng chứa UITextView chuyên dụng có khung là kích thước văn bản đầy đủ (nghĩa là kích thước của nội dung của UITextView) và đó là giám sát của UITextView của bạn. Khung UITextView của con bạn phải được đặt thành giới hạn của vùng chứa có thể cuộn bên ngoài.

Sau đó, tất cả những gì bạn phải làm là sử dụng quan sát khóa-giá trị để giám sát thuộc tính contentOffset của khung nhìn vùng chứa cuộn bên ngoài của bạn (trong trường hợp này là UICollectionView). Khi contentOffset của nó thay đổi, bạn cập nhật (1) contentOffset của UITextView và (2) thuộc tính biến đổi của lớp UITextView. Bằng cách cập nhật thuộc tính biến đổi đó, UITextView được cố định để lấp đầy phần hiển thị hiện tại của phần mềm giám sát của nó. Nhưng vì bạn cũng đang cập nhật contentOffset của UITextView, thủ thuật này hoàn toàn vô hình đối với người dùng ... nó trông và hoạt động như thể UITextView đơn giản là rất lớn.

-4

Xin chào tôi nghĩ rằng không muộn để trả lời. Tôi có cùng một vấn đề như bạn. Đây là giải pháp của tôi:

textView.scrollEnabled = YES;  
contentTextView.attributedText = finalAttrString; 
// contentTextView.text = [attrString string]; 
contentTextView.font = kFont(contentTextFS + [valueOfStepper intValue]); 

[contentTextView sizeToFit]; 
contentTextView.height += 1;//This is the key code 
//contentTextView.height = 8192.0f 

Them Tôi giải quyết những rắc rối và tôi có thể thay đổi kích thước dynamic.Successfull trên iOS 8

+0

textView == contentTextView – fltx

+0

Điều này có liên quan gì đến câu hỏi được yêu cầu? –

1

Dưới đây là một giải pháp đầy đủ chức năng, cho những ai muốn nó!

** Giả sử kích thước nội dung của bạn sẽ không vượt quá giới hạn của hai xem văn bản **

Giải pháp này hoạt động bằng cách thêm hai UITextViews để xem bạn, và tách văn bản của bạn giữa chúng. Có vẻ phức tạp, nhưng nó thực sự rất đơn giản!Tôi vừa mới viết một mô tả rất dài dòng :)

Bước 1 - Thêm hai UITextViews để xem của bạn:

tôi thêm mỏ kịch của tôi. Đặt chúng sao cho cái này nằm ngay phía trên cái kia, không có khoảng cách giữa chúng. Đừng lo lắng về việc thiết lập chiều cao (chúng tôi sẽ thiết lập điều đó sau).

Set khăn về quan điểm để họ được gắn với nhau từ phía trên và phía dưới, và các cạnh xung quanh của các container từ tất cả các bên khác, bao gồm cả đệm của bạn mong muốn. nghĩa là gắn chế độ xem văn bản đầu tiên vào vùng chứa từ trên cùng, bên trái và bên phải và đến chế độ xem văn bản thứ hai từ dưới cùng. Buộc chế độ xem văn bản thứ hai vào vùng chứa từ dưới cùng, bên trái và bên phải và đến chế độ xem văn bản đầu tiên từ trên cùng. Điều này sẽ đảm bảo rằng chúng kéo dài một cách thích hợp khi nội dung được đặt.

Đừng đặt bất kỳ hạn chế về chiều cao của các quan điểm, hoặc nếu bạn phải (để tránh cảnh báo từ những hạn chế thanh tra viên), thiết lập chiều cao của một trong những điểm đến được >= 20, hoặc một số con số tương tự nhỏ.

Tắt chỉ báo cuộn, nảy và di chuyển cho cả chế độ xem văn bản của bạn. Giải pháp này dựa trên các chế độ xem là chiều cao cố định, không thể cuộn, vì vậy nếu bạn muốn nội dung của mình cuộn, bạn nên sử dụng UIScrollView hoặc UITableViewCell làm vùng chứa.

Tạo cửa hàng cho hai quan điểm văn bản mới của bạn trong tập tin xem điều khiển của bạn, đặt tên cho chúng một cái gì đó giống như textView1textView2.

Bước 2 - Set textContainerInsets để zero:

Thiết lập thuộc tính textContainerInset trên cả hai quan điểm văn bản bằng không, hoặc là sử dụng User Defined Runtime Các thuộc tính:

hoặc mã:

self.textView1.textContainerInset = UIEdgeInsetsZero; 
self.textView2.textContainerInset = UIEdgeInsetsZero; 

Điều này sẽ đảm bảo rằng không có không gian hiển thị sẽ ứng dụng tai giữa hai chế độ xem khi nội dung được đặt và không ảnh hưởng đến khoảng cách khác xung quanh lượt xem của bạn.

Bước 3 - Tách nội dung của bạn, thiết lập nó, và cập nhật những đỉnh cao xem:

Đơn giản chỉ cần sao chép đoạn mã sau vào tập tin của bạn xem bộ điều khiển (viewDidLoad), và thiết lập các biến contentString nội dung của bạn.

/* Content is split across two UITextViews to avoid max drawing height */ 

NSString *contentString = @"Some very long piece of text..."; 

// Set text 
NSArray *components = [contentString componentsSeparatedByString:@"\n"]; 
NSInteger halfLength = [components count]/2; 
NSArray *firstHalf = [components subarrayWithRange:NSMakeRange(0, halfLength)]; 
NSArray *secondHalf = [components subarrayWithRange:NSMakeRange(halfLength, [components count] - halfLength)]; 
NSString *contentString1 = [firstHalf componentsJoinedByString:@"\n"]; 
NSString *contentString2 = [secondHalf componentsJoinedByString:@"\n"]; 
self.textView1.text = contentString1; 
self.textView2.text = contentString2; 

// Set text view heights 
CGFloat fixedWidth1 = self.textView1.frame.size.width; 
CGFloat fixedWidth2 = self.textView2.frame.size.width; 
CGSize newSize1 = [self.textView1 sizeThatFits:CGSizeMake(fixedWidth1, CGFLOAT_MAX)]; 
CGSize newSize2 = [self.textView2 sizeThatFits:CGSizeMake(fixedWidth2, CGFLOAT_MAX)]; 
CGRect newFrame1 = self.textView1.frame; 
CGRect newFrame2 = self.textView2.frame; 
newFrame1.size = CGSizeMake(fmaxf(newSize1.width, fixedWidth1), MIN(newSize1.height, 8192)); 
newFrame2.size = CGSizeMake(fmaxf(newSize2.width, fixedWidth2), MIN(newSize2.height, 8192)); 
self.textView1.frame = newFrame1; 
self.textView2.frame = newFrame2; 

Mã này tách contentString khoảng ở giữa, tìm kiếm các newline gần nhất. Nếu bạn muốn chia nhỏ nội dung của mình với một nhân vật khác, chỉ cần thay đổi tất cả các lần xuất hiện của \n ở trên thành bất kỳ nội dung nào bạn muốn chia nhỏ.

Bước 4 - Đặt thùng xem chiều cao của bạn:

Đặt giao diện container của bạn (scrollview, tableViewCell, bất cứ điều gì khác) với chiều cao của hai quan điểm văn bản của bạn, cộng với bất cứ điều gì thêm không gian mà bạn đã thiết lập ở trên và bên dưới chúng.

CGRect viewFrame = self.myView.frame; 
viewFrame.size.height = MIN(self.textView1.frame.size.height, 8192) + MIN(self.textView2.frame.size.height, 8192) + kTextViewContainerPadding; 
[self.myView setFrame:viewFrame]; 

(Trong mã của tôi, kTextViewContainerPadding là macro tôi đã đặt thành tổng không gian phía trên và bên dưới hai chế độ xem văn bản, trong vùng chứa của chúng).

Vậy đó! Chúc may mắn.

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