मुझे शुरुआत के अपडेट्स में एनीमेशन नहीं चाहिए, अपडेट्स को यूफिटेव्यू के लिए ब्लॉक करना चाहिए?


89

मेरे पास एक UITableView है जो एक कस्टम टेबल सेल का उपयोग कर रहा है और प्रत्येक सेल में UIWebView है।

क्योंकि UIWebView को लोड करने में समय लगता है, मैं उन्हें हर कीमत पर पुनः लोड करने से बचना चाहता हूं। कुछ स्थितियों में, मेरे पास सभी कोशिकाएँ भरी हुई हैं, लेकिन उनकी ऊँचाई गड़बड़ है। इसलिए, मुझे "सेलफ़ोररॉउ" फ़ंक्शन को ट्रिगर किए बिना तालिका को "रिलेआउट" करना होगा।

  1. मैं निश्चित रूप से reloadData का उपयोग नहीं कर सकता ... क्योंकि यह कोशिकाओं को फिर से लोड करेगा।
  2. मैंने tableView.setNeedDisplay, setNeedsLayout आदि की कोशिश की, उनमें से कोई भी तालिका कोशिकाओं को पुनर्व्यवस्थित करने में सक्षम नहीं है
  3. जिस तरह से यह काम किया, वह है startupdates / endupdates ब्लॉक को कॉल करने के लिए, यह ब्लॉक सेलफ़ॉरर फायरिंग के बिना मेरी तालिका को रिले करने में सक्षम है! लेकिन, मैं एनीमेशन नहीं चाहता था! यह ब्लॉक एक एनीमेशन प्रभाव पैदा करता है, लेकिन मैं इसे नहीं चाहता ...

मैं अपनी समस्या कैसे हल कर सकता हूं?

जवाबों:


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

1
यह भी खूब रही! मुझे लगता है कि इसमें कुछ सबसे दिलचस्प अनुप्रयोग हैं। मैंने पाया कि यदि आप पास होते हैं तो भी पुनः लोड करने की विधि हमेशा चेतन होगी UITableViewRowAnimationNone, लेकिन इसके साथ एनीमेशन को आसानी से दरकिनार किया जा सकता है!
फ्लाइंग_Banana

65

ब्लॉक का उपयोग करके इसे करने का एक और तरीका

Obj सी

[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

इस काम के लिए मुझे स्विफ्टी को निम्न कार्य करने थे:

// 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)पूर्ण ब्लॉक के अंदर रखना महत्वपूर्ण है ।
लासे बंक

लेकिन यह Footer को तब तक अपडेट नहीं करता जब तक आप टेबलव्यू स्क्रॉल नहीं करते।
मिस्टर बीन

@ Mr.Bean पूरा मामला क्या है? (यानी आपके टेबलव्यू में हमेशा एक पाद होता है, क्या आप एक डालने या एक को हटाने की कोशिश कर रहे हैं?)
नील जप्था

हमेशा एक पाद लेख होना चाहिए, बस पाद लेख को अद्यतन करने की आवश्यकता है (अर्थात पाद के अंदर 2 विचार हैं, स्थिति के आधार पर विचारों को छिपाने / अनसुना करने की आवश्यकता है।)
श्री बीन

@ Mr.Bean आपके अपडेट ब्लॉक में क्या है? यहां सबसे अधिक विस्तार योग्य तरीका अनुभाग को फिर से लोड करना होगा।
नील जफ्था 18

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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.