5

Tôi gặp sự cố khi nhận kết quả nhất quán từ UITextViews trong UITableViewCell bằng NSAttributedStrings.Cách liên tục vẽ NSAttributedString trong UITextView trong UITableViewCell

Bên trong - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

if (cell == nil) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 

    headerText = [[UITextView alloc]initWithFrame:CGRectZero]; 
    [headerText setUserInteractionEnabled:NO]; 
    headerText.tag = HEADER_TEXT; 
    [cell.contentView addSubview:headerText]; 
} else { 
    headerText = (UITextView*)[cell.contentView viewWithTag:HEADER_TEXT]; 
} 

//...setting up attributed strings 


[headerText setAttributedText:headerString]; 

CGSize headerSize = [headerText sizeThatFits:CGSizeMake(246, CGFLOAT_MAX)]; 

headerText.frame = CGRectMake(45, 8, headerSize.width, headerSize.height); 

Kết quả:

Before Scrolling No contentinset

Như bạn có thể thấy, hai cái đầu tiên xuất hiện để vẽ văn bản theo cách mà tôi mong đợi/muốn. Trong hai phương thức cuối cùng của phương thức UITextView sizeThatFits trả về một kích thước lớn hơn nhiều, sau đó được yêu cầu để vẽ văn bản và văn bản trở thành trung tâm trong khung chứ không phải chặt chẽ ở phía trên cùng của khung. Đây là một vấn đề bởi vì tôi muốn có thể bố trí các khung nhìn khác dựa trên chiều cao khung uitextview.

Sau khi cuộn ra khỏi khung và lại: enter image description here

Bây giờ nó được thậm chí người lạ, khi các tế bào được tái sử dụng, và chuỗi do được thiết lập lại. uitextview vẽ văn bản theo cách không nhất quán.

Thậm chí Thiết lập contentInsets để

headerText.contentInset = UIEdgeInsetsMake(-8, -8, -8, -8); 

Không cung cấp bất kỳ loại kết quả phù hợp:

enter image description here

Và Sau cuộn với contentinset thiết lập: enter image description here

Có khác thuộc tính trên UITextView cho phép tôi nhận được hành vi thứ tôi cần?

Trả lời

8

Khi thiết lập các chuỗi do của một UITextView mà trước đây đã có một chuỗi do khác nhau, bạn phải luôn luôn đặt tất cả các thuộc tính chuỗi liên quan của UITextView để nil đầu tiên, ví dụ:

self.tv.text = nil; 
self.tv.font = nil; 
self.tv.textColor = nil; 
self.tv.textAlignment = NSTextAlignmentLeft; 
self.tv.attributedText = s2; 

Nếu không, như bạn có phát hiện, các tính năng cũ của chuỗi được phân bổ trước đó vẫn treo xung quanh và ảnh hưởng đến chuỗi được phân bổ mới.

Nói chung, tuy nhiên, tôi phải nói rằng tôi không thấy lý do tại sao bạn đang sử dụng UITextView. Nếu bạn không cần người dùng có thể chỉnh sửa các chuỗi được phân bổ này, hãy sử dụng UILabel hoặc người khác chỉ cần vẽ chuỗi được phân bổ trực tiếp để hiển thị chính xác nhất có thể. NSAttributedString cung cấp cho bạn tất cả sức mạnh bạn cần để đo kích thước và vẽ trong kích thước đó.

+0

Tôi đang sử dụng UITextView vì nó triển khai Giao thức UITextInput. Điều này cho phép tôi tạo các nút trên một số đoạn văn bản nhất định. Tôi thừa nhận rằng việc vẽ trực tiếp văn bản sẽ thuận lợi. Tôi nên tìm hiểu thư viện iOS nào để đạt được điều đó? Cảm ơn bạn lần nữa vì đã trả lời câu hỏi. –

+0

Không có "thư viện" là cần thiết để vẽ văn bản. Đó là một phần của UIKit. – matt

+0

Tôi nghĩ rằng tôi có thể cần phải sử dụng CoreText để có thể xác định liệu một liên lạc có ở trên đầu dòng hoặc dòng văn bản đã cho hay không. –

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