2012-04-25 13 views
6

पर स्क्रॉल रखें I एनीमेशन के साथ तालिकादृश्य की ऊंचाई का आकार बदलने का प्रयास कर रहा है, यह tableview के frame.size.height को एनिमेट करके ठीक काम करता है।UITableView ऊंचाई का आकार बदलें, और नीचे

, मैं एक tableview है कि 200px ऊंचाई नीचे करने के लिए स्क्रॉल किया है, मैं मैं चलाने 100px को यह चेतन करना चाहते समस्या है, एक सरल

[UIView animateWithDuration:0.245f animations:^{ 
CGRect frame = tableview.frame; 
frame.size.height = 100.f; 
tableview.frame = frame; 
}]; 

इस ठीक काम करता है, लेकिन मैं इसे आकार दिया के बाद यह अब टेबलव्यू के नीचे स्क्रॉल नहीं किया गया है। मैं एनिमेटिंग करते समय टेबलव्यू को हमेशा नीचे स्क्रॉल करना चाहता हूं। मैं

[tablview scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES]; 

बुला सही से पहले/के बाद मैं आकार एनीमेशन शुरू की तरह differnet चीजों की बहुत कोशिश की, लेकिन मैं उन्हें 100% सिंक करने के लिए पाने में कामयाब रहे नहीं किया है। टेबलव्यू के निचले भाग को स्क्रॉलव्यू के अंतिम तत्व को प्रदर्शित करते समय टेबलव्यू का आकार बदलने का कोई तरीका है।

+0

उपयोग के लिए

UIView.animate(withDuration: 0.25) { [weak self] in guard let strongSelf = self else { return } // ... // updateConstraints // ... strongSelf.view.layoutIfNeeded() if reduceSize { tableView.scrollToLastRow(animated: false) } else { tableView.scrollToLastRow(animated: true) } } 

एक्सटेंशन [: एनिमेशन: पूरा होने: UIView animateWithDuration] के बजाय? – onnoweb

+1

मैं चाहता हूं कि स्क्रॉलएनाइज़ेशन आकार बदलने वाले एनीमेशन के साथ न हो, लेकिन धन्यवाद :) –

उत्तर

2

मैं मेरी समस्या के लिए एक समाधान मिल गया है, वहाँ बहुत अच्छी तरह से एक बेहतर समाधान हो सकता है, लेकिन यह वास्तव में बहुत अच्छी तरह से काम करता है :)

इससे पहले कि मैं एनिमेट मैं देख अगर contentSize.height है शुरू लक्ष्य ऊंचाई की तुलना में बड़ा है, इसलिए यदि मैं निम्नलिखित है:

if (mMessages.contentSize.height > 150.f) 
{ 
    CGFloat expandedOffsetY = 52.f; 
    CGFloat collapsedBottomOffset = (150.f + 18.f); 
    CGFloat expandedBottomOffset = (MIN(320.f, mMessages.contentSize.height) + expandedOffsetY); 
    tableFrame.origin.y = (collapsedBottomOffset - expandedBottomOffset) + expandedOffsetY; 
} 
else 
{ 
    tableFrame.origin.y = 18.f; 
    tableFrame.size.height = 150.f; 
} 

यह एक शून्य से origin.y में tableview रखा जाएगा, तो मैं क्लिप उप दृश्यों के साथ एक "जनक" UIView अंदर tableview लिपटे है = हाँ।

फिर मेरे पास "पूर्ण" एनीमेशन ब्लॉक है जो लक्ष्य मानों को "रीसेट" करता है।

CGRect tableFrame = mMessages.frame; 
tableFrame.origin.y = 18.f; 
tableFrame.size.height = 150.f; 
mMessages.frame = tableFrame; 

if (mMessages.contentSize.height > tableFrame.size.height) 
{ 
    float contentOffsetY = mMessages.contentSize.height - tableFrame.size.height; 
    mMessages.contentOffset = CGPointMake(0.0f, contentOffsetY); 
} 
0

सामग्री को अपडेट करने का प्रयास करें तालिका दृश्य की ऑफसेट जब आप फ्रेम को एनिमेट करते हैं।

[UIView animateWithDuration:0.245f animations:^{ 
CGRect frame = tableview.frame; 
frame.size.height = 100.f; 
tableview.frame = frame; 

float contentOffsetY = tableview.contentSize - tableview.frame.size.height; 
tableview.contentOffset = CGPointMake(0, contentOffsetY); 

}]; 
+0

सलाह के लिए धन्यवाद, मुझे डर है कि ऐसा लगता है कि ऐसा नहीं लगता है कि मैं इसे चाहता हूं, थोड़ा खोदने के बाद यह सामग्री को सेट करने जैसा दिखता है ऑफसेट करते समय ऑफसेट ऊंचाई कुछ अजीब व्यवहार देता है (क्षमा करें लेकिन समझाने के लिए मुश्किल छोड़ दें)। लेकिन परिणाम यह नहीं है कि आकार बदलने के दौरान तालिकादृश्य के नीचे ऊपर एनिमेटेड है। –

0
[UIView animateWithDuration:0.245f animations:^{ 
     CGRect frame = tableview.frame; 
     frame.size.height = 100.f; 
     tableview.frame = frame; 
} completion:^(BOOL finished) { 
     // Find your last indexpath 
     [tablview scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES]; 
} ]; 
+0

मैं चाहता हूं कि स्क्रॉलनाइज़ेशन आकार बदलने वाले एनीमेशन के साथ न हो, लेकिन धन्यवाद :) –

0

एनीमेशन ब्लॉक में नीचे करने के लिए tableview स्क्रॉल था मेरे लिए काम कर, एक छोटी सी मोड़ के साथ: जब मैं tableView मैं एनिमेट बिना scrollToIndexPath कहा जाता है के hight कम है, और जब मैं tableView विस्तार मैं बुलाया एनीमेशन के साथ scrollToIndexPath। UITableView

extension UITableView { 

    func scrollToLastRow(animated: Bool) { 
     let lastSection = numberOfSections-1 
     let lastRow = numberOfRows(inSection: lastSection)-1 
     let lastIndexPath = IndexPath(row: lastRow, section: lastSection) 
     scrollToRow(at: lastIndexPath, at: .bottom, animated: animated) 
    } 
} 
संबंधित मुद्दे