Saya tidak ingin animasi di mulai pembaruan, blok pembaruan akhir untuk uitableview?

89

Saya memiliki UITableView yang menggunakan sel tabel kustom dan setiap sel memiliki UIWebView.

Karena UIWebView membutuhkan waktu lama untuk memuat, saya ingin menghindari memuat ulang di semua biaya. Dalam beberapa situasi, saya telah memuat semua sel, tetapi tingginya kacau. Oleh karena itu, saya perlu "menyampaikan" tabel tanpa memicu fungsi "cellForRow".

  1. Saya pasti tidak dapat menggunakan reloadData ... karena akan memuat ulang sel lagi.
  2. Saya mencoba tableView.setNeedDisplay, setNeedsLayout dll, tidak ada yang mampu mengatur ulang sel tabel
  3. Satu-satunya cara kerjanya, adalah dengan memanggil blok startupdates / endupdates, blok ini mampu menyampaikan tabel saya tanpa mengaktifkan cellForRow! TAPI, saya tidak ingin animasi! Blok ini menghasilkan efek animasi tetapi saya tidak menginginkannya ...

Bagaimana saya bisa mengatasi masalah saya?

mkto
sumber

Jawaban:

217
[UIView setAnimationsEnabled:NO];
[tableView beginUpdates];
[tableView endUpdates];
[UIView setAnimationsEnabled:YES];
Evgeny Shurakov
sumber
1
Ini bagus! Saya rasa ini memiliki beberapa aplikasi yang paling menarik. Saya menemukan bahwa metode reload section akan selalu dianimasikan bahkan jika Anda lewat UITableViewRowAnimationNone, tetapi dengan ini animasi dapat dengan mudah dilewati!
Flying_Banana
65

Satu cara lagi untuk melakukannya dengan menggunakan balok

Obj-C

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

Cepat

UIView.performWithoutAnimation {
    tableView.beginUpdates()
    tableView.endUpdates()   
}
Dmitriy
sumber
4

mengerjakan proyek saya, tetapi bukan solusi umum.

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
hstdt
sumber
3

Swifties saya harus melakukan hal berikut agar ini bekerja:

// 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()
Neil Japhtha
sumber
Membantuku. Terima kasih. Penting untuk dimasukkan ke setAnimationsEnabled(true)dalam blok penyelesaian.
Tidur Lasse
Tapi ini tidak memperbarui Footer sampai Anda menggulir tampilan tabel.
Mr Bean
@ Mr. Bean apa kasus lengkapnya? (yaitu apakah tampilan tabel Anda selalu memiliki footer, apakah Anda mencoba memasukkan satu atau menghapus satu?)
Neil Japhtha
Selalu memiliki Footer, hanya perlu memperbarui footer (yaitu Ada 2 tampilan di dalam footer, perlu menyembunyikan / menampilkan tampilan tergantung pada kondisinya.)
Mr. Bean
@ Mr.Bean apa isi blok pembaruan Anda? Metode yang paling dapat diperpanjang di sini adalah memuat ulang bagian tersebut.
Neil Japhtha
1

Saya lebih suka transisi yang mulus:

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

Cobalah.

Jorge Arimany
sumber
0

Saya ingin memperbarui tinggi sel untuk bagian 5 dan kode berikut berfungsi untuk saya:

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)
Aadi007
sumber