2016-02-22 17 views
9

Tôi đang cố gắng đặt một mở rộng UITableViewCell bằng cách nhấn vào nút.Làm cách nào để buộc uitableview thay đổi kích thước ô (sau khi hủy kích hoạt giới hạn độ cao)?

Tôi đang sử dụng các ràng buộc để buộc động UITextView để cho biết chiều cao mới của nó UITableViewCell. (sử dụng autolayout và UITableViewAutomaticDimension)

Điều này hoạt động như mong đợi mà không có nút: Chiều cao của UITableViewCell tùy thuộc vào chiều cao của UITextView.

Có một ràng buộc trên UITextView để tối đa hóa kích thước của ô, khi nhấn vào nút (ô bị thu gọn), tôi muốn loại bỏ giới hạn chiều cao thành UITextView (đó là giới hạn chiều cao ô) và cập nhật ô cho phù hợp. Đây là phương pháp mở rộng:

-(void)extendCellWasTapped:(UITableViewCell*)senderCell{ 

    MAFollowingPostTableViewCell *cell = (MAFollowingPostTableViewCell*)senderCell; 

    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; 

    if (![self.arrayExtendedTitlesAtIndexPaths containsObject:indexPath]) { 
     [self.arrayExtendedTitlesAtIndexPaths addObject:indexPath]; 
    } 

    if ([self.tableView.indexPathsForVisibleRows containsObject:indexPath]) { 
     dispatch_async(dispatch_get_main_queue(), ^(void){ 

      [NSLayoutConstraint deactivateConstraints:@[cell.constraintTextViewHeight]]; 

      // CGPoint offset = self.tableView.contentOffset; 

      [self.tableView beginUpdates]; 
      [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone]; 
      [self.tableView endUpdates]; 

// I would like to minimize the animations as well here.. but thats another //problem 
//   [self.tableView.layer removeAllAnimations]; 
//   [self.tableView setContentOffset:offset animated:NO]; 
//   [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES]; 

     }); 
    } 
} 

Nếu tôi nhấn vào nút và sau đó cuộn đến ô tương tự, nó đã được mở rộng. Vì vậy, tôi đang thiếu một cái gì đó ở đây. Tôi đã cố gắng làm [cell updateConstraints] sau khi hủy kích hoạt ràng buộc, nhưng nó không hoạt động.

CẬP NHẬT

Lúc đầu, nút không hiển thị đối với một số lý do. Và tôi nhận thấy rằng (với cùng một mã) nếu tôi di chuyển xuống và sau đó lên, nút xuất hiện và, nếu tôi cố gắng mở rộng nó, nó hoạt động.

CẬP NHẬT

Đây là UIViewController tôi:

http://www.gfycat.com/FairBossyAfricanporcupine

Chú ý rằng nút mở rộng là không có, nhưng một khi tôi di chuyển xuống/lên nói xuất hiện và nó kéo dài tế bào khi tôi nhấn vào nút mở rộng.

CẬP NHẬT

tôi nhận thấy rằng khi textSize đang được tính toán (để xem nếu ô được mở rộng hay không), lúc đầu, các TextView là rộng hơn so với trạng thái cuối cùng của nó. Và tôi thực hiện việc kiểm tra này trên cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

MAPostTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentifier forIndexPath:indexPath]; 

cell.delegate = self; 
cell.selectionStyle = UITableViewCellSelectionStyleNone; 

MAPostFollowing *post = (MAPostFollowing*)[self.arrayPosts objectAtIndex:indexPath.section]; 

cell.textViewTitle.textContainer.lineBreakMode = NSLineBreakByWordWrapping; 

NSString *title = [post.post title]; 

[cell.textViewTitle setText:title]; 

UIButton * buttonExtend = [cell buttonExtend]; 

if ([self.arrayExtendedTitlesAtIndexPaths containsObject:indexPath]) { 
    cell.constraintTextViewHeight.active = NO; 

    if (![buttonExtend isHidden]) { 
     buttonExtend.hidden = YES; 
     buttonExtend.userInteractionEnabled = NO; 
    } 
}else{ 

    cell.constraintTextViewHeight.active = YES; 

    NSLog(@"index %li", (long)indexPath.row); 

    BOOL b = ![self isTitleExtendable:title forTextView:cell.textViewTitle]; // Checks if the current text view is able to fit the title. If not, it will show the buttonExtend 

    buttonExtend.hidden = b; 
    buttonExtend.userInteractionEnabled = !b; 

} 
} 
... 

Vì vậy, trên đường chạy trốn đầu tiên (trước khi cuộn) các [tự isTitleExtendable: Tiêu đề forTextView: cell.textViewTitle]; không trả lại giá trị mong muốn vì textView không có chiều rộng đúng khi textSize đang được tính toán.

Vì vậy, tôi tin rằng có các tùy chọn sau: - buộc các textViewTitle để làm mới sau khi nó đã thay đổi cách bố trí (như vậy, tính toán một cách chính xác tình trạng UI mở rộng) - kiểm tra lại tình trạng UI mở rộng khi textViewTitle thay đổi độ rộng

CẬP NHẬT

Phương pháp PrepareForReuse textViewTitle vẫn có khung rộng hơn. Trên phương thức layoutSubviews, nó có một khung nhỏ.Thách thức ở đây là có nghĩa là được gọi thường xuyên hơn, và nó được tôi trường hợp sai (nút được hiển thị khi nó không nên)

Đây là những gì tôi đã thử nghiệm với:

-(void)layoutSubviews{ 
[super layoutSubviews]; 

BOOL b = [self isTitleExtendable:self.textViewTitle.text forTextView:self.textViewTitle]; 

self.buttonExtend.hidden = !b; 
self.buttonExtend.userInteractionEnabled = b; 

if (!b) { 
    NSLog(@"Button hidden YES UserInteraction NO"); 
}else{ 
    NSLog(@"Button hidden NO UserInteraction YES"); 
} 

NSLog(@"textViewTitle layout %f",self.textViewTitle.frame.size.width); 
} 
+0

gì xảy ra nếu bạn cố gắng để loại bỏ các ràng buộc thay vì hủy kích hoạt nó '[cell removeConstraints: cell.constraintTextViewHeight]'? – Randy

+0

điều tương tự. Không chắc chắn nếu nó sẽ làm việc một khi các tế bào được tái sử dụng (đó là lý do tại sao tôi vô hiệu hóa thay vì loại bỏ) – jonypz

+0

Tôi là một chút bối rối như những gì câu hỏi được. Bằng cách nhìn vào GIF của bạn có vẻ như vấn đề là nút không có ở đó khi ô được hiển thị lần đầu tiên. Trong câu hỏi bạn có vẻ ngụ ý, thay vào đó nút đó là có và không hoạt động. Chịu với tôi, có lẽ nó chỉ là tôi hiểu sai câu hỏi. – Eppilo

Trả lời

0

đang quên xóa đường dẫn chỉ mục từ self.arrayExtendedTitlesAtIndexPaths?

if (![self.arrayExtendedTitlesAtIndexPaths containsObject:indexPath]) { 
    [self.arrayExtendedTitlesAtIndexPaths addObject:indexPath]; 
} 
else 
{ 
    [self.arrayExtendedTitlesAtIndexPaths removeObject:indexPath]; 
} 
+0

No. Đây là hành động được thực hiện khi người dùng chạm vào nút mở rộng. Và một khi anh ta làm vậy, ô đó sẽ luôn được mở rộng. – jonypz

0

Nếu nút không có ở đó và trong khi bạn cuộn nút đó lại hiển thị chắc chắn bạn có vấn đề với khả năng sử dụng lại.

Bạn có thể quyết định hiển thị hoặc ẩn nút trong cellForRowAtIndexPath:. Nếu bạn có một điều kiện, hãy cố gắng để hiển thị nút này luôn, và nếu điều này sẽ làm việc như mong đợi sau đó ẩn một nút bên trong một tế bào bất cứ khi nào ràng buộc này là có hay không. Phương pháp đúng là prepareForReuse bên trong lớp con UITableViewCell.

+0

Đây có thể là cách để đi. Tôi vẫn không chắc chắn 100% về việc triển khai mặc dù – jonypz

+0

kiểm tra bản cập nhật của tôi – jonypz

-1

Gọi [cell layoutSubviews]; khi thay đổi của bạn hoàn tất.

+0

Theo tài liệu trên phương pháp layoutSubviews: "Bạn không nên gọi trực tiếp phương thức này". – GingerBreadMane

1

Để thực hiện việc như vậy, bạn không nên dựa vào hạn chế, nhưng trên tableView(_:heightForRowAtIndexPath:) bạn chỉ cần cung cấp chiều cao phù hợp tùy theo ngữ cảnh.

Nhấn nút của bạn sẽ kích hoạt thay đổi để tableView(_:heightForRowAtIndexPath:) trả về một giá trị khác cho ô của bạn mà bạn mở rộng.

Và chỉ sau khi làm cò này, chỉ cần làm:

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

mà không cần bất cứ điều gì giữa chúng, nó sẽ kích hoạt "hoạt hình tự nhiên" của UITableView và thực hiện chính xác những gì bạn muốn

+0

như mô tả cho biết, tôi đang sử dụng UITableViewAutomaticDimension – jonypz

+0

Tôi vẫn sẽ tìm mẹo cập nhật bắt đầu để buộc cập nhật hoạt ảnh;) Nhưng tôi đã không thử khi sử dụng ô có kích thước tự động – AncAinu

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