2010-09-20 5 views
13

Tôi có UITextView trong nội dung UITableViewCell và cho phép ô tự động sao cho văn bản đã nhập được hiển thị đầy đủ - những gì tôi đang cố gắng hoàn thành là một ô tự động hóa như ứng dụng iOS4 gốc có, khi bạn nhập "ghi chú" cho liên hệ - tức là khi contentSize của textView thay đổi - tôi gọi reloadRowsAtIndexPaths và trong heightForRowAtIndexPath của đại biểu, tôi cung cấp chiều cao mới cho hàng - điều này thực hiện công việc, tuy nhiên nó không đẹp và mượt mà như ứng dụng của liên hệ - Tôi gần như chắc chắn Apple sử dụng một số thủ thuật không có giấy tờ trong ứng dụng đó để làm cho contentView của ô mở rộng mượt mà và hoạt hình mà không cần gọi lại reloadRowsAtIndexPaths. Câu hỏi của tôi là làm thế nào bạn sẽ đề nghị để thực hiện chức năng như vậy? Tôi hy vọng tôi không bỏ lỡ bất kỳ chi tiết nào trong phần giải thích.UITextView trong một UITableViewCell mịn tự động thay đổi kích thước

+0

Bạn đã cố gắng sử dụng hình ảnh động UIView không? Tôi không bao giờ sử dụng chúng cho việc này, nhưng điều đó có thể hiệu quả. – Jukurrpa

+0

có, tôi đã thử một số hình động UIView cho nội dung bên trong, nó kinda làm mịn quá trình, nhưng tôi tự hỏi nếu có một cách để không sử dụng reloadRowsAtIndexPaths, có vẻ như không có phương pháp tiếp xúc cho điều đó. – justadreamer

Trả lời

15

Hãy thử mã này bên dưới, nó sẽ giúp ích. Bạn không phải sử dụng bất kỳ chức năng tải lại nào như reloadRowsAtIndexPaths.

// TextView đại biểu

- (void)textViewDidChange:(UITextView *)textView { 
    if (contentView.contentSize.height > contentRowHeight) { 

    contentRowHeight = contentView.contentSize.height; 

    [theTableView beginUpdates]; 
    [theTableView endUpdates]; 

    [contentView setFrame:CGRectMake(0, 0, 300.0, contentView.contentSize.height)]; 
    } 
} 

// tableview đại biểu

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    CGFloat height; 

    if (indexPath.row == 0) 
     height = kTitleRowHeight; 
    else 
     height = contentRowHeight; 

    return height; 
} 
+0

contentView là gì trong mã này? Tôi cho rằng đó là textView? – justadreamer

+0

Đó là tài sản của UITableViewCell. UITextView được thêm vào thuộc tính này. [cell.contentView addSubview: textView]; –

+0

Tôi đang sử dụng giải pháp này trong ứng dụng của mình và nó đang hoạt động 100% trên iPhone, nhưng trên iPad nó không phải là: khi người dùng nhập nhiều dòng văn bản, 'UITableViewCell' sẽ cao hơn vì nó được cho là , nhưng 'UITextView' thực sự di chuyển * lên *, sao cho dòng đầu tiên của văn bản nằm trên đầu của' UITableViewCell' - và ẩn. Bất kỳ ý tưởng nào về cách giải quyết vấn đề này trên iPad? – Jason

11

tôi thấy cách tốt nhất để giải quyết việc này.

Trước hết, tất nhiên, bạn sẽ muốn tạo UITextView và thêm nó vào ô nội dung của ô của bạn. Tôi tạo ra một biến thể hiện của UITextView gọi là "cellTextView" Đây là mã mà tôi sử dụng:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"]; 

    if (!cellTextView) { 
     cellTextView = [[UITextView alloc] initWithFrame:CGRectMake(5.0, 5.0, cell.bounds.size.width - 30.0, cell.bounds.size.height - 10.0)]; // I use these x and y values plus the height value for padding purposes. 
    } 
    [cellTextView setBackgroundColor:[UIColor clearColor]]; 
    [cellTextView setScrollEnabled:FALSE]; 
    [cellTextView setFont:[UIFont boldSystemFontOfSize:13.0]]; 
    [cellTextView setDelegate:self]; 
    [cellTextView setTextColor:[UIColor blackColor]]; 
    [cellTextView setContentInset:UIEdgeInsetsZero]; 
    [cell.contentView addSubview:cellTextView]; 

    return cell; 
} 

Sau đó, tạo một biến int gọi numberOfLines và đặt biến tới 1 trong phương pháp init của bạn. Sau đó, trong phương pháp textViewDidChange textViewDelegate của bạn, sử dụng mã này:

- (void)textViewDidChange:(UITextView *)textView 
{ 
    numberOfLines = (textView.contentSize.height/textView.font.lineHeight) - 1; 

    float height = 44.0; 
    height += (textView.font.lineHeight * (numberOfLines - 1)); 

    CGRect textViewFrame = [textView frame]; 
    textViewFrame.size.height = height - 10.0; //The 10 value is to retrieve the same height padding I inputed earlier when I initialized the UITextView 
    [textView setFrame:textViewFrame]; 

    [self.tableView beginUpdates]; 
    [self.tableView endUpdates]; 

    [cellTextView setContentInset:UIEdgeInsetsZero]; 
}  

Cuối cùng, dán mã này vào phương pháp heightForRowAtIndexPath của bạn:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    float height = 44.0; 
    if (cellTextView) { 
     height += (cellTextView.font.lineHeight * (numberOfLines - 1)); 
    } 
    return height; 
} 
+0

+1 Tính năng này hoạt động tốt. –

+1

yep, công trình này tuyệt vời +1. Ngoài ra, bằng cách lưu trữ numberOfLines trong một NSArray tại index = indexPath.row với tập textView.tag tại indexPath.row, sau đó nó làm cho nhiều UITextviews trong nhiều ô thay đổi với kích thước văn bản trong mỗi ô. – Rambatino

+0

Cảm ơn! Và một sửa chữa dễ dàng để có thể tìm ra một cách khác để xác định textView nào bạn muốn thay đổi kích thước. Mã này được điều chỉnh để hoạt động với một textView trên mỗi ô. –