2011-05-18 14 views
5

मेरे पास शीर्ष पर और नीचे के नीचे की छाया के साथ एक तालिका है (मैट गैलाघर के समाधान का उपयोग करके: http://cocoawithlove.com/2009/08/adding-shadow-effects-to-uitableview.html)। ये UITableView क्लास एक्सटेंशन के लेआउटस्यूब्यूविज़ विधि में जोड़े गए हैं।पंक्ति हटाने के बाद UITableView कॉलबैक एनीमेशन पूर्ण

मैं प्रत्येक मुख्य सेल के नीचे कोशिकाओं को गतिशील रूप से जोड़ता और हटाता हूं (ये अतिरिक्त डेटा प्रदान करते हैं) - चलिए इन "विस्तार" कक्षों को कॉल करते हैं। एक समय में केवल एक ही खुला है। अंतिम मुख्य सेल के नीचे "विस्तार कक्ष" को हटाते समय, एनीमेशन शुरू होने के बाद, छाया अंतिम सेल (विस्तारित सेल के ऊपर) तक ऊपर की ओर बढ़ती है। ऐसा इसलिए होता है क्योंकि layoutSubview विधियां तालिका के अंतिम सेल को हटाने के लिए एनीमेशन को बदलने के लिए मानती हैं RowAtIndexPaths प्रारंभ होती है (एनीमेशन समाप्त होने के बजाए)।

तो, संक्षेप में, मुझे विस्तारित सेल के नीचे छाया को हटाने के तरीके की आवश्यकता है क्योंकि इसे हटाया जा रहा है। ऐसा करने का सबसे अच्छा तरीका सुनिश्चित नहीं है। UITableView अब मानता है कि सेल अंतिम सेल होने के लिए, तो मुझे यकीन है कि (के बाद से UITableView इस प्रकार सेल हो जाता है) भी कैसे सेल प्राप्त करने के लिए नहीं कर रहा हूँ:

NSIndexPath *lastRow = [indexPathsForVisibleRows lastObject]; 
if ([lastRow section] == [self numberOfSections] - 1 && 
    [lastRow row] == [self numberOfRowsInSection:[lastRow section]] - 1) 
{ 
     //adds shadow below it here 
    } 

तो भी एनीमेशन की शुरुआत फँसाने यदि UITableView अभी भी "विस्तार" सेल के ऊपर मुख्य सेल को "lastObject" के ऊपर सोचता है तो इसका अधिक उपयोग नहीं होता है।

किसी भी विचार के लिए धन्यवाद।

+0

आप के रूप में 'ऊपर और नीचे छाया जोड़ने की कोशिश की है tableHeaderView' और 'tableFooterView' क्रमशः? निश्चित रूप से इन विचारों को जगह में रखा जाता है और हटाए गए एनीमेशन के बाद तालिका का आकार बदलते समय उचित रूप से स्थानांतरित किया जाता है। – simeon

उत्तर

0

मुझे यकीन है कि आप बाहरी फ्रेम कार्य से निर्भरताओं का उपयोग करने के बजाय कस्टम टेबल व्यू क्लास का उपयोग कर आसानी से इसे प्राप्त कर सकते हैं, केवल उचित दृश्य से प्राप्त होते हैं और इसमें सबव्यू जोड़ते हैं।

लेकिन यदि आप इसे इस तरह से रखने का आग्रह करते हैं। इसे हटाने से पहले अपने स्वयं के चर में एक संदर्भ लें।

+0

मैट गैलेजर की छायादार तालिका दृश्य ** ** एक कस्टम टेबल क्लास है ... तो आपका क्या मतलब है? – fezfox

+0

मेरा कहना है कि उस तालिका दृश्य में उप दृश्य जोड़ें और उस सबव्यू में उस ढाल छवि को जोड़ें। –

+0

ठीक है, यह एक सुझाव है - लेकिन आप इस दृष्टिकोण को कहां प्रस्तावित करते हैं? ओपी में मैंने जो मुद्दा बनाया है वह यह है कि अंतिम सेल को हटाने के लिए एनीमेशन शुरू होता है, [indexPathsForVisibleRows lastObject] तुरंत ऊपर की पंक्ति को प्रतिबिंबित करेगा। तो यदि वह संदर्भ है जिसका उपयोग आप अपनी छाया को स्थानांतरित करने के लिए करते हैं (जैसा कि यह फिलहाल है) पल एनीमेशन शुरू होता है, उपरोक्त सेल पर छाया ऊपर की ओर बढ़ती है। शायद असली चीज है कि एनीमेशन पूर्ण होने तक उस छाया को अद्यतन करना बंद करें, या इसके बजाय ऊपर दिए गए सुझाव को तालिकाफल का उपयोग करने के लिए। मैंने एक साल पहले छोड़ दिया - वैसे भी – fezfox

4

इस

[CATransaction begin]; 

[tableView beginUpdates]; 

//... 

[CATransaction setCompletionBlock: ^{ 
    // Code to be executed upon completion 
}]; 

[tableView deleteRowsAtIndexPaths: indexPaths 
       withRowAnimation: UITableViewRowAnimationAutomatic]; 


[tableView endUpdates]; 

[CATransaction commit]; 
+0

मुझे 'DeleteRowsAtIndexPaths: withRowAnimation' एनीमेशन पूर्ण होने के बाद तालिका को रीफ्रेश करने की आवश्यकता है, यह मेरे लिए किया गया। धन्यवाद! शायद 2015 में एक बेहतर तरीका है? – ToddB

+0

नहीं, ऐप्पल को इसके लिए कॉलबैक जोड़ना चाहिए! –

0

स्विफ्ट (विचार ही है, आप निश्चित रूप से Obj सी में इस का उपयोग कर सकते हैं) का प्रयास करें:

UIView.animateWithDuration(0.3, animations: {() -> Void in 
    self.tableView.scrollToRowAtIndexPath(indexPathes, withRowAnimation: UITableViewRowAnimation.None) 
}, completion: { (Bool) -> Void in 
    // The logic you want to execute after the animation 
}) 
संबंधित मुद्दे