2016-02-07 6 views
8

पर एनीमेशन शुरू होता है मैं एक तालिका दृश्य ठीक से रे Wenderlich की मार्गदर्शिका के आधार पर गतिशील पंक्ति ऊंचाइयों करने के लिए कॉन्फ़िगर here पाया है:UITableViewController: गतिशील पंक्ति की ऊँचाई के साथ नीचे करने के लिए स्क्रॉल गलत स्थिति

मैं एक स्पष्ट करने के लिए बाधाओं की स्थापना सेल से ऊपर तक नीचे की बाधाओं की रेखा। मैं सामग्री hugging और सामग्री संपीड़न प्रतिरोध प्राथमिकताओं और अनुमानित पंक्ति ऊंचाई भी स्थापित किया।

इस कोड मैं सेटअप करने के लिए तालिका दृश्य का उपयोग करें:

func configureTableView() { 
    // its called on viewDidLoad() 
    tableView.rowHeight = UITableViewAutomaticDimension 
    tableView.estimatedRowHeight = 100.0 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    configureTableView() 

    for i in 1...20 { 
     messages.append([ 
      "title": "foo \(i)", 
      "message": "bla \(i)\nbla\nbla" 
     ]) 
    } 

    // this is because the actual row heights are not available until the next layout cycle or something like that 
    dispatch_async(dispatch_get_main_queue(), {self.scrollToBottom(false)}) 
} 

func scrollToBottom(animated:Bool) { 
    let indexPath = NSIndexPath(forRow: self.messages.count-1, inSection: 0) 

    self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: UITableViewScrollPosition.Bottom, animated: animated) 
} 

और यह मैं कैसे नई पंक्तियाँ जोड़ने है:

@IBAction func addMore(sender:UIBarButtonItem) { 
    let message = [ 
     "title": "haiooo", 
     "message": "silver"] 

    messages.append(message) 

    let indexPath = NSIndexPath(forRow: messages.count-1, inSection: 0) 

    tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Bottom) 

    scrollToBottom(true) 
} 

डिफ़ॉल्ट पंक्तियों के साथ सेटअप ठीक कर रहे हैं। यह अपेक्षित के रूप में नीचे पंक्तियों और स्क्रॉल जोड़ता है।

लेकिन जब मैं इसके बाद नई पंक्तियां जोड़ता हूं, तो स्क्रॉलिंग अंतिम सेल से शुरू होती प्रतीत होती है। जैसे ही मैं अधिक सेल्स जोड़ता हूं, ऑफसेट बढ़ता प्रतीत होता है। Imgur

यह निश्चित रूप से स्क्रॉल एनीमेशन (नहीं insertRow एनीमेशन), क्योंकि यह ठीक से स्क्रॉल जब एनीमेशन बंद कर दिया है से संबंधित है:

यहाँ यह हो रहा दिखा एक gif है।

estimatedRowHeight बदलना स्क्रॉलिंग ऑफ़सेट पर अंतर बनाता है, लेकिन मुझे यह तय करने वाला कोई मूल्य नहीं मिला।

मैंने dispatch_async का उपयोग करके स्क्रॉल में देरी करने का भी प्रयास किया लेकिन इसमें कुछ भी नहीं बदला।

क्या आपके पास कोई विचार है?

+0

वीडियो से मैं यह नहीं बता सकता कि क्या गलत है। और मुझे समझ में नहीं आता कि "... स्क्रॉलिंग अंतिम सेल से शुरू होने लगती है" का अर्थ है। क्या आप स्पष्टीकरण दे सकते हैं? समस्या के साथ एक उदाहरण परियोजना उपलब्ध कराने में मददगार भी हो सकता है। –

+0

डेव, ध्यान दें कि स्क्रॉल शुरू होने पर स्क्रीन 17 और 18 स्क्रीन पर शीर्ष पर कैसे दिखते रहते हैं, जब वे पहले से ही तालिका दृश्य के दृश्य क्षेत्र से बाहर होते हैं। ऐसा लगता है कि एनीमेशन शुरू करने से पहले स्क्रीन बढ़ जाती है। आप यहां स्रोत कोड पा सकते हैं: https://github.com/marcio0/ios-playground/tree/master/scrolltest –

+0

ठीक है, मैं अब वीडियो में देख सकता हूं (अगर मैं इसे डाउनलोड करता हूं और फ्रेम-दर जाता हूं फ्रेम)। लेकिन मैं इसे नमूना परियोजना में नहीं देख रहा हूं। मैंने विभिन्न फोन मॉडल (लेकिन सभी 9.2) की कोशिश की और एनिमेशन को धीमा करने की भी कोशिश की, लेकिन आपके पास जो समस्या हो रही है उसे कभी नहीं देखा। –

उत्तर

13

वाह, यह एक मजेदार चुनौती थी। परीक्षण परियोजना पोस्ट करने के लिए धन्यवाद।

तो ऐसा लगता है कि नई पंक्ति जोड़ने के बाद वहां कुछ ऐसा है जहां तालिका दृश्य सोचता है कि यह स्क्रॉल किया गया है। मुझे UIKit में एक बग होने के लिए लगता है। तो इसके आसपास काम करने के लिए, मैंने एनीमेशन लागू करने से पहले तालिका दृश्य को 'रीसेट' करने के लिए कुछ कोड जोड़ा।

@IBAction func addMore(sender:UIBarButtonItem) { 
    let message = [ 
     "title": "haiooo", 
     "message": "silver"] 
    messages.append(message) 

    tableView.reloadData() 

    // To get the animation working as expected, we need to 'reset' the table 
    // view's current offset. Otherwise it gets confused when it starts the animation. 
    let oldLastCellIndexPath = NSIndexPath(forRow: messages.count-2, inSection: 0) 
    self.tableView.scrollToRowAtIndexPath(oldLastCellIndexPath, atScrollPosition: .Bottom, animated: false) 

    // Animate on the next pass through the runloop. 
    dispatch_async(dispatch_get_main_queue(), { 
     self.scrollToBottom(true) 
    }) 
} 

मैं इसे insertRowsAtIndexPaths(_:withRowAnimation:) के साथ काम करने के लिए नहीं मिल सकता है, लेकिन reloadData() ठीक काम किया:

यहाँ मैं के साथ समाप्त हो गया है। फिर आपको नई अंतिम पंक्ति को एनिमेट करने से पहले एक ही देरी की आवश्यकता है।

संबंधित मुद्दे