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);
}
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
đ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
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