जब स्क्रीन पर सामग्री फिट होती है तो UITableView तालिका में स्क्रॉलिंग को अक्षम कैसे करें


240

मेरे iphone ऐप में कुछ (समूहीकृत शैली) टेबल हैं (केवल स्क्रीन के हिस्से पर और इसके साथ जोड़ा गया Interface Builderहै, लेकिन इससे उप-वर्ग नहीं है UITableViewController), जो कि 80% समय छोटा है और स्क्रीन पर फिट होगा। जब तालिका स्क्रीन पर फिट होती है, तो मैं स्क्रॉल करना अक्षम करना चाहता हूं, इसे थोड़ा क्लीनर बनाने के लिए। लेकिन अगर तालिका स्क्रीन से दूर हो जाती है (जब पंक्तियों को बाद में इसमें जोड़ा जाता है), तो मैं फिर से स्क्रॉल करने में सक्षम करना चाहूंगा (क्योंकि अन्यथा आप इस सामग्री को देख सकते हैं।)

क्या इसे करने का कोई तरीका है? मैं यह पता लगाने के लिए प्रतीत नहीं कर सकते। मुझे पता है:

tableView.scrollEnabled = NO;

लेकिन मुझे यकीन नहीं है कि जहां, या अगर मुझे यह काम करने के लिए टेबल ऑब्जेक्ट आकार या कुछ की गणना करना है।


अद्यतन : यहाँ समाधान है कि अंत में मेरे लिए काम किया है:

if (table.contentSize.height < table.frame.size.height) {
   table.scrollEnabled = NO;
 }
else {
   table.scrollEnabled = YES;
 }

मैं reloadDataटेबल पर कॉल करने के बाद इस कोड को चलाता हूं , और यह सही आकार की गणना करता है और काम करता है।

table.frame.size.heightInterface Builderस्क्रीन पर प्रदर्शित वस्तु का वास्तविक आकार (आप इसे देख सकते हैं ) है, जबकि table.contentSize.heightऊँचाई है: शीर्ष लेख, पाद लेख, और प्रत्येक कक्ष की ऊँचाई को एक साथ जोड़ा गया है।


1
धन्यवाद। उस समाधान ने मेरे लिए काम किया। हालाँकि, मैंने UITableView का विस्तार किया और स्क्रॉल-अक्षम को अक्षम करने के लिए रीलोडडेट को ओवरराइड किया। कारण यह है कि जब मेरा व्यू कंट्रोलर बनाया जाता है तो टेबल व्यू लोड किया जाता है। इस तरह आपको दो बार पुनः लोड करने की आवश्यकता नहीं है।
ब्रैंडन ओ'रोरके

@JoeBlow मुझे लगता है कि आपने ओपी की बात को याद किया। सवाल यह नहीं है कि उछाल को कैसे निष्क्रिय किया जाए, यह तब होता है जब टेबलव्यू को स्क्रॉल करने की आवश्यकता होती है, केवल स्क्रॉलिंग (और उछाल, सबसे अधिक संभावना) को सक्षम करें।
काइल क्लेग

शायद सीमा का उपयोग करना बेहतर है, क्योंकि मुझे लगता है कि यदि आप अपनी मेज को थोड़ा घुमाते हैं, तो फ्रेम में बदलाव होने वाला है।
रिकार्डो

वहाँ होना चाहिए: अगर (table.contentSize.height <= table.frame.size.height)
Grzegorz Krukowski

जवाबों:


396

मुझे लगता है कि आप सेट करना चाहते हैं

tableView.alwaysBounceVertical = NO;

6
जब आप AutoLayout का उपयोग कर रहे हों, तो यह contentSize <फ्रेम से बेहतर काम करता है। उत्तर स्वीकार किया जाना चाहिए।
जोशुआ नृत्य

1
मैं ऑटो लेआउट का उपयोग कर रहा हूं और यह उत्तर वास्तव में मुझे चाहिए।
गोल्डन थम्ब

3
स्क्रॉलिंग को अक्षम करने से बेहतर है
किरीट वाघेला

5
एक आकर्षण की तरह काम करता है, आप इसे interface builderउतार-चढ़ाव से उछाल कर और क्षैतिज / लंबवत रूप से उछाल भी कर सकते हैं ।
अहसान अब्राहिम

11
स्विफ्ट के लिए - tableView.alwaysBounceVertical = false
स्विफ्टबॉय

44

आप इस फ़ंक्शन का उपयोग करके दृश्यमान कोशिकाओं की संख्या सत्यापित कर सकते हैं:

- (NSArray *)visibleCells

यह विधि दिखाई देने वाली कोशिकाओं के साथ एक सरणी लौटाएगी, इसलिए आप इस सरणी में वस्तुओं की संख्या की गणना कर सकते हैं और अपनी तालिका में वस्तुओं की संख्या के साथ तुलना कर सकते हैं .. यदि यह समान है .. तो आप स्क्रॉलिंग का उपयोग करके अक्षम कर सकते हैं:

tableView.scrollEnabled = NO;

जैसा कि @ गिन्नी ने उल्लेख किया है .. हमें आंशिक रूप से दिखाई देने वाली कोशिकाओं के साथ समस्या हो सकती है, इसलिए यह समाधान इस मामले में बेहतर काम करता है:

tableView.scrollEnabled = (tableView.contentSize.height <= CGRectGetHeight(tableView.frame));

यदि आप इस समाधान का उपयोग कर रहे हैं तो यह काम पूरा करें:

tableView.alwaysBounceVertical = NO.

धन्यवाद! यह अब मेरे लिए ज्यादातर काम कर रहा है। केवल समस्या मुझे अब हो रही है जब कोशिकाओं को आंशिक रूप से दिखाई दे रहा है वे अभी भी दृश्यमान के रूप में गिनते हैं और इस प्रकार स्क्रॉल करना अक्षम हो जाता है जब उस स्थिति में मैं चाहता हूं कि यह सक्षम हो।
गिन्नी

6
पता लगा लिया! आंशिक रूप से दृश्यमान सेल समस्या के कारण, आप वास्तव में दृश्यमान का उपयोग नहीं कर सकते, लेकिन यह काम करता है: if (table.contentSize.height < table.frame.size.height)>> मूल पोस्ट में संपादन देखें।
गिन्नी

42

स्विफ्ट में:

tableView.alwaysBounceVertical = false

18
मैं हमेशा ऐसे ̶n̶s upw̶e̶r̶s re "फिर से लिखना" को बढ़ाता हूं क्योंकि आधुनिक वाक्य रचना में परिवर्तित होने के लिए समय की आवश्यकता होती है।
दिमित्री इसेव

14

इसलिए कई उत्तर हैं और एक ही बार में सभी सामग्री की आवश्यकता होती है इसलिए मैं यह उत्तर जोड़ रहा हूं:

यदि आप AutoLayout का उपयोग कर रहे हैं, तो इसे केवल आपके लिए काम करना चाहिए:

  • कोड में:

tableView.alwaysBounceVertical = false

  • या इंटरफ़ेस बिल्डर में:

बस यह विकल्प और untick" Bounce Vertically" विकल्प खोजें।

यहाँ संदर्भ है:

यहां छवि विवरण दर्ज करें

यदि आप AutoLayout का उपयोग नहीं कर रहे हैं:

 override func viewDidLayoutSubviews() {
    // Enable scrolling based on content height
    tableView.isScrollEnabled = tableView.contentSize.height > tableView.frame.size.height
 }

13

इसे इस्तेमाल करे

[yourTableView setBounces:NO];

@ काइल - नोट के लिए धन्यवाद! - लेकिन देखो कि स्वचालित रूप से क्या होता है। यदि यह स्क्रीन (या अन्य धारक) से छोटा है, तो यह स्क्रॉल नहीं करता है (और जाहिर है कि उछाल नहीं होगा, coz यह स्क्रॉल भी नहीं होगा)। यदि यह स्क्रीन से अधिक लंबा है, तो यह स्क्रॉल (और वास्तव में उछाल) होगा। नहीं??
फटी

हो सकता है कि मैं संग्रह विचारों का बहुत अधिक उपयोग कर रहा हूँ ... शायद यह संग्रह के विचारों के लिए वर्णन के रूप में काम करता है, लेकिन UITableView के लिए नहीं ??
फटी

9

आप स्क्रॉल दृश्य क्षेत्र में इनका चयन / अचयनित करके सारणी को सक्षम / अक्षम उछाल या स्क्रॉल सेट कर सकते हैं

स्क्रॉल दृश्य संपादन क्षेत्र


3

आप इसे अपने स्टोरीबोर्ड में संपादित कर सकते हैं (यदि आप एक का उपयोग कर रहे हैं)। टेबल दृश्य के नीचे एक चेकबॉक्स है जो कहता है "स्क्रॉलिंग सक्षम"। इसे अनचेक करें और आपका काम हो गया।


3

// Enable scrolling based on content height self.tableView.scrollEnabled = table.contentSize.height > table.frame.size.height;


3
मुझे लगता है कि मैं आपके समाधान को पढ़ने के बाद प्रबुद्ध था। बहुत धन्यवाद
Arash

मैंने इसे अपने विचार में इस्तेमाल किया है -DearAppear
मारिया

1
मेरा मतलब था कि देखेंडायलटाउटब्यूड्स न देखेंडीडीएपियर
मारिया

0

मेरा मानना ​​है कि एक टेबलव्यू सेल के लिए डिफ़ॉल्ट ऊंचाई 44.0f है। आप एक हाथ में अपने डेटा स्रोत होने चाहिए? फिर बस जांचें कि क्या [array count]*44.0fफ्रेम सीमा से परे है और यदि ऐसा है tableview.scrollEnabled = NO, तो इसे हां में सेट करें। ऐसा करें जहां आप उस विशेष तालिका के लिए डेटा स्रोत का पता लगाते हैं।


मेरी तालिका कोशिकाएं अलग-अलग आकार की हैं (और किसी भी समय आकार बदल सकती हैं; मैं heightForRowAtIndexPath विधि का उपयोग कर रहा हूं) इसलिए मैं शायद 44.0f हार्डकोड नहीं करना चाहूंगा। मुझे विश्वास है कि संख्या वैसे भी tableView.rowHeight के समान है?
गिन्नी

आप तब उस पद्धति में अपनी कुल ऊंचाई की गणना कर रहे होंगे। सरल सही? यदि यह स्क्रीन बाउंड से अधिक है, तो स्क्रॉल को सक्षम करें, अन्यथा इसे अक्षम छोड़ दें। विधि सभी दृश्यमान कोशिकाओं के लिए कहा जाएगा। यदि आपके पास स्क्रीन को पार करने के लिए पर्याप्त डेटा नहीं है, तो आप उस विधि में कुल ऊंचाई की गणना कर सकते हैं। एक वैश्विक चर में जोड़ते रहें जो प्रत्येक कॉल पर लौटता है और आपकी कुल ऊंचाई है।
बॉर्न

रॉबर्टो का जवाब यह सब प्राप्त करने और गणना को तालिका के लिए छोड़ने का एक आसान तरीका है।
बॉर्न
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.