Tôi không muốn hoạt ảnh trong khối cập nhật bắt đầu, cập nhật kết thúc cho uitableview?


89

Tôi có UITableView đang sử dụng ô bảng tùy chỉnh và mỗi ô có UIWebView.

Vì UIWebView mất nhiều thời gian để tải nên tôi muốn tránh tải lại chúng bằng mọi giá. Trong một số tình huống, tôi đã tải tất cả các ô, nhưng chiều cao của chúng bị xáo trộn. Do đó, tôi cần "chuyển tiếp" bảng mà không kích hoạt chức năng "cellForRow".

  1. Tôi chắc chắn không thể sử dụng reloadData ... vì nó sẽ tải lại các ô.
  2. Tôi đã thử tableView.setNeedDisplay, setNeedsLayout, v.v., không ai trong số họ có thể sắp xếp lại các ô trong bảng
  3. Cách duy nhất nó hoạt động, là gọi khối beginupdates / endupdates, khối này có thể chuyển tiếp bảng của tôi mà không cần kích hoạt cellForRow! NHƯNG, tôi không muốn hoạt ảnh! Khối này tạo ra hiệu ứng hoạt hình nhưng tôi không muốn nó ...

Làm thế nào tôi có thể giải quyết vấn đề của tôi?

Câu trả lời:


216
[UIView setAnimationsEnabled:NO];
[tableView beginUpdates];
[tableView endUpdates];
[UIView setAnimationsEnabled:YES];

1
Điều đó thật tuyệt! Tôi thấy nó có một số ứng dụng thú vị nhất. Tôi thấy rằng phương thức tải lại các phần sẽ luôn hoạt ảnh ngay cả khi bạn chuyển vào UITableViewRowAnimationNone, nhưng với điều này, hoạt ảnh có thể dễ dàng bị bỏ qua!
Flying_Banana

65

Một cách khác để làm điều đó bằng cách sử dụng các khối

Ob-C

[UIView performWithoutAnimation:^{
   [self.tableView beginUpdates];
   [self.tableView endUpdates];
}];

Nhanh

UIView.performWithoutAnimation {
    tableView.beginUpdates()
    tableView.endUpdates()   
}

4

làm việc trong dự án của tôi, nhưng không phải là một giải pháp chung.

let loc = tableView.contentOffset
UIView.performWithoutAnimation {

    tableView.reloadData()

    tableView.layoutIfNeeded()
    tableView.beginUpdates()
    tableView.endUpdates()

    tableView.layer.removeAllAnimations()
}
tableView.setContentOffset(loc, animated: true)//animation true may perform better

3

Swifties Tôi đã phải làm như sau để điều này hoạt động:

// Sadly, this is not as simple as calling:
//      UIView.setAnimationsEnabled(false)
//      self.tableView.beginUpdates()
//      self.tableView.endUpdates()
//      UIView.setAnimationsEnabled(true)

// We need to disable the animations.
UIView.setAnimationsEnabled(false)
CATransaction.begin()

// And we also need to set the completion block,
CATransaction.setCompletionBlock { () -> Void in
    // of the animation.
    UIView.setAnimationsEnabled(true)
}

// Call the stuff we need to.
self.tableView.beginUpdates()
self.tableView.endUpdates()

// Commit the animation.
CATransaction.commit()

Đã giúp tôi. Cảm ơn. Quan trọng là đặt setAnimationsEnabled(true)bên trong khối hoàn thành.
Lasse Bunk

Nhưng điều này không cập nhật Chân trang cho đến khi bạn cuộn chế độ xem bảng.
Mr. hạt đậu,

@ Mr.Bean trường hợp đầy đủ là gì? (tức là không tableview của bạn luôn luôn có một chân, bạn đang cố gắng để chèn một hoặc loại bỏ một?)
Neil Japhtha

Luôn có Chân trang, chỉ cần cập nhật chân trang (tức là Có 2 chế độ xem bên trong chân trang, cần ẩn / bỏ các chế độ xem tùy theo điều kiện.)
Mr Bean

@ Mr.Bean khối cập nhật của bạn chứa những gì? Phương pháp có thể mở rộng nhất ở đây là tải lại phần này.
Neil Japhtha

1

Tôi muốn có một quá trình chuyển đổi suôn sẻ:

CGPoint offset = self.tableView.contentOffset;
[UIView transitionWithView:self.tableView duration:0.5 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
        [self.tableView reloadData];
        self.tableView.contentOffset = offset;
    } completion:nil];

hãy thử một lần.


0

Tôi muốn cập nhật chiều cao ô cho phần 5 và mã sau phù hợp với tôi:

UiView.setAnimationsEnabled(False)
self.productTableView.reloadSections(NSIndexSet(index: SectionType.ProductDescription.hashValue), withRowAnimation: UITableViewRowAnimation.None)
self.productTableView.scrollToRowAtIndexPath(NSIndexPath(forRow: 0, inSection: 5), atScrollPosition: UITableViewScrollPosition.Bottom, animated: false)
UIView.setAnimationsEnabled(true)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.