2012-04-25 35 views
6

Tôi đang cố gắng đổi kích thước chiều cao của bảng xem bằng hoạt ảnh, nó hoạt động tốt bằng cách làm hoạt hình frame.size.height của tableview.Thay đổi kích thước chiều cao UITableView và tiếp tục cuộn ở dưới cùng

Vấn đề là, tôi có một tableview đó là 200px chiều cao và cuộn xuống phía dưới, tôi muốn động này để 100px, tôi chạy một đơn giản

[UIView animateWithDuration:0.245f animations:^{ 
CGRect frame = tableview.frame; 
frame.size.height = 100.f; 
tableview.frame = frame; 
}]; 

này hoạt động tốt, nhưng sau khi tôi thay đổi kích cỡ nó nó không còn được cuộn xuống dưới cùng của chế độ xem bảng nữa. tôi muốn các tableview luôn luôn được cuộn ở phía dưới trong khi hoạt hình. tôi đã thử rất nhiều thứ khác nhau như gọi số

[tablview scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES]; 

ngay trước/sau khi tôi bắt đầu hoạt ảnh thay đổi kích thước, nhưng tôi chưa quản lý để đồng bộ hóa 100%. Có cách nào để thay đổi kích thước tableview trong khi dưới cùng của tableview hiển thị các yếu tố cuối cùng của scrollview.

+0

Sử dụng [UIView animateWithDuration: hình ảnh động: hoàn thành:] để thay thế? – onnoweb

+1

Tôi muốn scrollanimation xảy ra với các hình ảnh động thay đổi kích thước không sau, nhưng cảm ơn :) –

Trả lời

2

Tôi tìm thấy một giải pháp cho vấn đề của tôi, có thể rất tốt là một giải pháp tốt hơn nhưng điều này thực sự hoạt động khá tốt :)

Trước khi tôi bắt đầu tạo hiệu ứng động tôi thấy nếu contentSize.height là lớn hơn so với chiều cao mục tiêu, nếu vì vậy tôi như sau:

if (mMessages.contentSize.height > 150.f) 
{ 
    CGFloat expandedOffsetY = 52.f; 
    CGFloat collapsedBottomOffset = (150.f + 18.f); 
    CGFloat expandedBottomOffset = (MIN(320.f, mMessages.contentSize.height) + expandedOffsetY); 
    tableFrame.origin.y = (collapsedBottomOffset - expandedBottomOffset) + expandedOffsetY; 
} 
else 
{ 
    tableFrame.origin.y = 18.f; 
    tableFrame.size.height = 150.f; 
} 

này sẽ đưa tableview trong một origin.y trừ, sau đó tôi đã quấn tableview bên trong một "cha mẹ" UIView với tầm Clip phụ = YES.

Sau đó, tôi có khối hoạt ảnh "đã hoàn tất" để "đặt lại" thành giá trị đích.

CGRect tableFrame = mMessages.frame; 
tableFrame.origin.y = 18.f; 
tableFrame.size.height = 150.f; 
mMessages.frame = tableFrame; 

if (mMessages.contentSize.height > tableFrame.size.height) 
{ 
    float contentOffsetY = mMessages.contentSize.height - tableFrame.size.height; 
    mMessages.contentOffset = CGPointMake(0.0f, contentOffsetY); 
} 
0

Thử cập nhật contentOffset của chế độ xem bảng khi bạn tạo hoạt ảnh cho khung.

[UIView animateWithDuration:0.245f animations:^{ 
CGRect frame = tableview.frame; 
frame.size.height = 100.f; 
tableview.frame = frame; 

float contentOffsetY = tableview.contentSize - tableview.frame.size.height; 
tableview.contentOffset = CGPointMake(0, contentOffsetY); 

}]; 
+0

Cảm ơn lời khuyên, im sợ nó không giống như tôi muốn nó, sau khi làm một chút đào nó trông giống như thiết lập contentOffsetY trong khi animating chiều cao cho một số hành vi kỳ lạ (xin lỗi nhưng rất khó để giải thích). Nhưng kết quả là không phải là đáy của tableview animates trở lên trong khi thay đổi kích thước. –

0
[UIView animateWithDuration:0.245f animations:^{ 
     CGRect frame = tableview.frame; 
     frame.size.height = 100.f; 
     tableview.frame = frame; 
} completion:^(BOOL finished) { 
     // Find your last indexpath 
     [tablview scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES]; 
} ]; 
+0

Tôi muốn scrollanimation xảy ra với các hoạt hình thay đổi kích thước không sau, nhưng cảm ơn :) –

0

cuộn tableview xuống đáy trong khối hoạt hình đã làm việc cho tôi, với một xoắn nhỏ: khi tôi làm giảm cao của tableView tôi gọi scrollToIndexPath mà không cần hiệu ứng động, và khi tôi mở rộng tableView tôi gọi là scrollToIndexPath với hoạt ảnh.

UIView.animate(withDuration: 0.25) { [weak self] in 
    guard let strongSelf = self 
     else { return } 
    // ... 
    // updateConstraints 
    // ... 
    strongSelf.view.layoutIfNeeded() 

    if reduceSize { 
     tableView.scrollToLastRow(animated: false) 
    } else { 
     tableView.scrollToLastRow(animated: true) 
    } 
} 

Extension for UITableView

extension UITableView { 

    func scrollToLastRow(animated: Bool) { 
     let lastSection = numberOfSections-1 
     let lastRow = numberOfRows(inSection: lastSection)-1 
     let lastIndexPath = IndexPath(row: lastRow, section: lastSection) 
     scrollToRow(at: lastIndexPath, at: .bottom, animated: animated) 
    } 
} 
Các vấn đề liên quan