ฉันไม่ต้องการภาพเคลื่อนไหวในการอัปเดตเริ่มต้นปิดกั้นการอัปเดตสำหรับ uitableview?


89

ฉันมี UITableView ที่ใช้เซลล์ตารางที่กำหนดเองและแต่ละเซลล์มี UIWebView

เนื่องจาก UIWebView ใช้เวลาโหลดนานฉันจึงต้องการหลีกเลี่ยงการโหลดซ้ำโดยเสียค่าใช้จ่ายทั้งหมด ในบางสถานการณ์ฉันโหลดเซลล์ทั้งหมดแล้ว แต่ความสูงของมันกลับยุ่งเหยิง ดังนั้นฉันต้อง "relayout" ตารางโดยไม่เรียกใช้ฟังก์ชัน "cellForRow"

  1. ฉันไม่สามารถใช้ reloadData ได้อย่างแน่นอน ... เพราะมันจะโหลดเซลล์อีกครั้ง
  2. ฉันลอง tableView.setNeedDisplay, setNeedsLayout และอื่น ๆ ไม่มีใครสามารถจัดเรียงเซลล์ตารางใหม่ได้
  3. วิธีเดียวที่ใช้งานได้คือการเรียกบล็อก beginupdates / endupdates บล็อกนี้สามารถถ่ายทอดตารางของฉันได้โดยไม่ต้องยิง cellForRow! แต่ฉันไม่ต้องการภาพเคลื่อนไหว! บล็อกนี้สร้างเอฟเฟกต์ภาพเคลื่อนไหว แต่ฉันไม่ต้องการ ...

ฉันจะแก้ปัญหาของฉันได้อย่างไร?

คำตอบ:


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

1
นี่มันเยี่ยมมาก! ฉันพบว่ามันมีแอพพลิเคชั่นที่น่าสนใจที่สุด ฉันพบว่าวิธีการรีโหลดส่วนจะทำให้เคลื่อนไหวได้เสมอแม้ว่าคุณจะผ่านไปUITableViewRowAnimationNoneก็ตาม แต่ด้วยวิธีนี้ภาพเคลื่อนไหวสามารถข้ามได้อย่างง่ายดาย
Flying_Banana

65

อีกวิธีหนึ่งที่ทำได้โดยใช้บล็อก

Obj-C

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

รวดเร็ว

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

4

ทำงานในโครงการของฉัน แต่ไม่ใช่วิธีแก้ปัญหาทั่วไป

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 ฉันต้องทำสิ่งต่อไปนี้เพื่อให้ได้ผล:

// 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()

ช่วยฉันด้วย ขอบคุณ. สิ่งสำคัญที่จะต้องใส่ไว้setAnimationsEnabled(true)ในบล็อกเสร็จ
Lasse Bunk

แต่จะไม่อัปเดตส่วนท้ายจนกว่าคุณจะเลื่อนมุมมองตาราง
Mr. Bean

@ Mr.Bean คดีเต็มคืออะไร? (เช่น tableview ของคุณมีส่วนท้ายเสมอคุณกำลังพยายามแทรกหรือลบออกหรือไม่)
Neil Japhtha

ต้องมีส่วนท้ายเสมอเพียงแค่ต้องอัปเดตส่วนท้าย (เช่นมี 2 มุมมองภายในส่วนท้ายจำเป็นต้องซ่อน / เลิกซ่อนมุมมองขึ้นอยู่กับเงื่อนไข)
Mr. Bean

@ Mr.Bean บล็อคอัพเดตของคุณมีอะไรบ้าง? วิธีที่ขยายได้มากที่สุดที่นี่คือการโหลดส่วนนี้ซ้ำ
Neil Japhtha

1

ฉันชอบที่จะมีการเปลี่ยนแปลงที่ราบรื่น:

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

ให้มันลอง.


0

ฉันต้องการอัปเดตความสูงของเซลล์สำหรับส่วนที่ 5 และรหัสต่อไปนี้ใช้ได้กับฉัน:

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)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.