UITableViewStyleGrouped iOS7 में शैली के साथ मेरे UITableView के शीर्ष पर अतिरिक्त पैडिंग क्यों है


635

IOS7 में शुरू करते हुए, मेरे UITableViewस्टाइल के शीर्ष पर अतिरिक्त स्थान है, जिसमें एक शैली है UITableViewStyleGrouped

यहाँ एक उदाहरण है:

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

टेबलव्यू पहले तीर पर शुरू होता है, इसमें अस्पष्टीकृत पैडिंग के 35 पिक्सेल हैं, फिर हरे हेडर UIViewद्वारा लौटाया जाता है viewForHeaderInSection(जहां अनुभाग 0 है)।

क्या कोई समझा सकता है कि यह 35 पिक्सेल राशि कहां से आ रही है और मैं इसे कैसे स्विच कर सकता हूं UITableViewStylePlain?


ध्यान दें:

IOS 11 और बाद में:

tableView.contentInsetAdjustmentBehavior = .never

क्या आप नवीनतम iOS 7 का उपयोग कर रहे हैं? विसंगतियों के इन प्रकारों में से कुछ (लेकिन सभी नहीं, और शायद यह एक नहीं) बाद के देव साक्षात्कारों के दौरान ठीक हो गए हैं। मुझे पता होना चाहिए: मैंने बहुत सारी समस्याओं को गायब कर दिया।
दान रोसेनस्टार्क

यहाँ उत्तर की जाँच करें - stackoverflow.com/a/18986158/1463604
निशांत

संक्षिप्त उत्तर यह है कि यह अतिरिक्त पैडिंग संभवतः टेबल व्यू हेडर (अनुभाग हेडर नहीं) के कारण है, और यह UITableView0.0 की ऊंचाई के साथ हेडर को सौंपा जाना पसंद नहीं करता है। अधिक जानकारी के लिए stackoverflow.com/a/31223403/1394534 की जाँच करें ।
ऑरेलियन पोर्ते

30
self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 0.0f, CGFLOAT_MIN)];ध्यान दें: यदि आप इसका उपयोग आयत की ऊंचाई में करते हैं, तो इसे अनदेखा कर दिया0.0f जाता है । इसलिए हम निकटतम-से-शून्य CGFloat का उपयोग संभव है (कम से कम मेरे लिए "काम किया" ... आदर्श समाधान नहीं)।
अलेजांद्रो इवान

1
@ अलेजांद्रोइवान आपकी टिप्पणी ने मेरी रात बना दी। मुझे समूहीकृत प्रोटोटाइप के साथ एक टेबल व्यू मिला है। मैं नंबर का उपयोग कर रहा हूँ = data.count और सेटिंग नंबर = 1 का उपयोग कर रहा हूँ। मैंने प्रत्येक के बीच एक साफ जगह बनाने के लिए एक ऊँची फ़्लोरफ़र्टरइन्सेक्शन सेट की है और किसी कारण से एक खाली टेबलहैडर व्यू दिखाई दिया।
रयान अलेक्जेंडर

जवाबों:


863

मुझे निम्नलिखित द्वारा मदद की गई थी:

YouStoryboard.storyboard> YouViewController> गुण निरीक्षक> अनचेक करें - स्क्रॉल दृश्य इनसेट समायोजित करें।

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


42
मुझे लगता है कि यह उस पैडिंग को हटाने का सही तरीका है, बजाय किनारे के मूल्यों के साथ छेड़छाड़ के।
हेजेग

21
यह मेरे लिए काम नहीं किया - मैं ऊपर एक अपारदर्शी नाव है और यह बंद कर दिया इसके तहत सामग्री धक्का।

5
कस्टम का उपयोग करते समय काम नहीं करता है collectionview। (जब टेबलव्यू अंदर है collectionviewcell)
अक्षत झवेरी

5
मेरे लिए काम नहीं किया; केवल एक चीज जो काम करती थी वह समूहीकृत
शिम

28
मुझे कंटेनर दृश्य के अंदर TableViewController के साथ यह समस्या थी। मुझे यह प्रॉपर्टी सीधे TableViewController जो कि एम्बेडेड थी, पर सेट करना था, लेकिन व्यू कंट्रोलर पर जिसमें कंटेनर व्यू था। फिर काम हुआ।
एंडी मोर्टिमर

325

मैंने इसके साथ थोड़ा और अधिक खेला और ऐसा लगता है कि यह टेबल व्यू की स्थापना का एक साइड-इफेक्ट है tableHeaderView = nil

क्योंकि मेरे tableView में एक गतिशील रूप से दिखाई देता है tableHeaderView, जब मुझे करने की tableHeaderViewबजाय self.tableView.tableHeaderView = nil;, मुझे छिपाने की आवश्यकता होती है , मैं करता हूं:

self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.tableView.bounds.size.width, 0.01f)];

मुझे यह समाधान कुछ हद तक मनमाने ढंग से स्थापित करने से बेहतर लगता है contentInset.topक्योंकि मैं contentInset.topगतिशील रूप से भी उपयोग करता हूं । जब भी मैं contentInset.topथकाऊ हो तो एक अतिरिक्त 35px को हटाने के लिए याद रखना ।


4
महान समाधान! दरअसल, आपको अपने कोड के अनुसार डिफ़ॉल्ट टेबल व्यू हेडर व्यू से छुटकारा पाने के लिए इसे 0.01 एफ पर सेट करना होगा।
सिमोन मंगानेली

2
BTW, यह इंटरफ़ेस बिल्डर में एक ड्रैग एंड ड्रॉप के साथ भी संभव है। कोई बात नहीं धन्यवाद! :)
रुडोल्फ एडमकोविस

8
आप इसके लिए एक पदक के हकदार हैं
वैभव गौतम

7
इस बात को ध्यान में रखें कि आपके टेबल व्यू के शीर्ष पर 0.01f ऊँचाई का दृश्य का मतलब होगा कि सभी कोशिकाएँ नीचे की ओर मिथ्या निरूपित हैं (पहली कोशिका जिनकी Y उत्पत्ति 0.01 है, cell_height + 0.01 के आगे, आदि) इसलिए उन कोशिकाओं की सामग्री गुमराह किया जाएगा। ( Debug > Color Misaligned Imagesअपने लिए यह देखने के लिए सिम्युलेटर चालू करें ।) आप ऐसा नहीं करना चाहते।
साइमन व्हाइटेकर

2
UITableViewHeaderFooterViewUIView के बजाय इसका उपयोग करना बेहतर है । और सिद्धांत CGFLOAT_MINरूप में 0.01fबेहतर के रूप में ही काम करता है।
Jaybo

178

IOS 7 के लिए यदि आप एक व्यू कंट्रोलर में एक टेबलव्यू आवंटित कर रहे हैं जो आप देख सकते हैं

self.edgesForExtendedLayout = UIRectEdgeNone;

आपकी समस्या मेरी जैसी ही लग रही थी

अपडेट करें:

IOS 9.x में स्विफ्ट:

self.edgesForExtendedLayout = UIRectEdge.None

स्विफ्ट 3:

self.edgesForExtendedLayout = UIRectEdge.init(rawValue: 0)

3
मेरे मैदान पर काम किया UITableView। मुद्दों तथ्य यह है मेरी वजह से उपजी UITableViewएक पर था UIViewControllerअंदर एक UINavigationControllerटेबल सामग्री 44 अंक ड्रॉप डाउन के लिए इतना प्रारंभिक सामग्री को पीछे नहीं था की वजह से navBar। यह मेरे लेआउट के साथ की जरूरत नहीं थी, हालांकि, यह सिर्फ मुद्दों का कारण बना। आखिरकार मैंने अपना कोड बदल दिया, automaticallyAdjustsScrollViewInsetsजिसमें काम भी किया।
DBD

यह गुण केवल उन नियंत्रकों को देखने के लिए लागू किया जाता है जो UINavigationController जैसे कंटेनर में एम्बेडेड हैं। विंडो का रूट व्यू कंट्रोलर इस संपत्ति पर प्रतिक्रिया नहीं करता है। इस संपत्ति का डिफ़ॉल्ट मान सभी है। .. मुझे लगता है कि डिफ़ॉल्ट 0 होना चाहिए? इसका कहां फायदा है।
देश_

5
स्विफ्ट 3 के साथ अधिक सुंदर:edgesForExtendedLayout = []
डेव बट्टन

नमस्कार @yeahdixon गुलाबी तीर बनाने के लिए आप किस सॉफ्टवेयर का उपयोग करते हैं? अग्रिम धन्यवाद
iArezki

174

उस contentInsetसंपत्ति को बदलने की कोशिश करें जो UITableViewविरासत में मिली है UIScrollView

self.tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);

यह एक वर्कअराउंड है, लेकिन यह काम करता है


6
contentTableView.contentInset = UIEdgeInsetsMake(-20, 0, -20, 0);मेरे लिए सबसे अच्छा काम किया क्योंकि ऊपर और नीचे 20 अतिरिक्त पिक्सेल थे।
ब्रायन

1
हालांकि यह "जानवर बल" समाधान काम करता है, मुझे लगता है कि नीचे वाले (विशेष रूप से स्वचालित रूप से समायोजित करें इनसेट) को उच्च स्थान दिया जाना चाहिए।
eladleb

134
self.automaticallyAdjustsScrollViewInsets = NO;

कोशिश करो, आप इससे निपट सकते हैं!


यह iOS 7.0 में टेबलहेडर व्यू को छिपाने के लिए बहुत अच्छा काम करता है, लेकिन पुराने संस्करणों में इसका समर्थन नहीं किया जाता है।
ब्रायन

IOS 7 के तहत महान काम करता है
StackRunner

3
महत्वपूर्ण: सुनिश्चित करें कि आप कंटेनर दृश्य नियंत्रक में ऐसा करते हैं, यदि आपका UITableView एक नियंत्रक पर रखा गया है, जिसे बाद में किसी अन्य नियंत्रक में एम्बेड किया गया है, तो इसे एम्बेड करने वाले शीर्ष नियंत्रक में करें, न कि सीधे उस जगह पर जहां आप UITableView डालते हैं (जहां ऑटोबायॉउट होगा) चीजों का ख्याल रखना)।
जेम्स स्टोन

इससे बेहतर है uncheck Adjust scroll view insets। क्योंकि कभी-कभी हम अपने यूआई के निर्माण के लिए स्टोरीबोर्ड का उपयोग नहीं करते हैं।
JW.ZG

यह मेरे लिए काम करता है। मैंने नेविगेशन बार और टेबलव्यू के लिए दृश्य संलग्न किया है, यह iOS 11 में नहीं हुआ है, लेकिन यह iOS 10 में होता है। धन्यवाद।
dobiho

78

आप पता लगा सकते हैं कि आपका ऐप iOS7 या उससे अधिक चल रहा है या अपने टेबल व्यू डेलिगेट में यह दो विधियाँ जोड़ें (आमतौर पर आपके UIViewController कोड में)

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return CGFLOAT_MIN;
}

-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return CGFLOAT_MIN;
}

यह शायद एक सुरुचिपूर्ण समाधान नहीं है, लेकिन मेरे लिए काम करता है

स्विफ्ट संस्करण:

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}

override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}

1
इसने मेरे लिए काम किया। UITableView कई अलग-अलग कारणों से शीर्ष पर स्थान जोड़ता है। विशेष रूप से, ओपी से संबंधित, समस्या केवल समूहबद्ध शैली तालिका दृश्य के लिए होती है। और इस समाधान ने समस्या को ठीक कर दिया।
राजवी

5
आप 0.001 के बजाय CGFLOAT_MIN का उपयोग कर सकते हैं यह आपको CGFloat का सबसे छोटा पूर्ण मूल्य प्रदान करता है।
eiKatte

2
यह सही उत्तर है क्योंकि वास्तविक विशेषता यह है कि पैडिंग केवल समूहित शैली तालिका दृश्य में है और इसे अनदेखा किया जाता है यदि आप शीर्ष लेख / पाद लेख निर्दिष्ट करते हैं
जैकब त्राहाल

इसे सही उत्तर के रूप में चिह्नित किया जाना चाहिए। ओवरराइड करने के लिए एक प्रतिनिधि विधि और यह प्रश्न का उत्तर देता है। कम से कम इसे पहले आज़माएं अगर आप इसे दूर तक सभी हैक पढ़ते हैं। ट्वीट करने की कोशिश करें: - (CGFloat) tableView: (UITableView *) tableView heightForHeaderInSection: (NSInteger) सेक्शन {// रिटर्न CGFLOAT_MIN; वापसी 30.0f; }
मैथ्यू फर्ग्यूसन

अच्छा! एक बोनस के रूप में, यदि आप समूहीकृत वर्गों के बीच शीर्ष और अधिक पर थोड़ा हेडर चाहते हैं, तो आप निम्न का उपयोग कर सकते हैं:override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return section == 0 ? 14 : 24 }
फ्रीक सैंडर्स

55

मैंने अपने मूल बग का कारण ढूंढ लिया है और इसे प्रदर्शित करते हुए एक नमूना परियोजना बनाई है। मेरा मानना ​​है कि iOS7 बग है।

IOS7 के रूप में, यदि आप समूहीकृत शैली के साथ एक यूआईटेबल व्यू बनाते हैं, लेकिन पहले लेआउट पर एक प्रतिनिधि सेट नहीं है, तो आप एक प्रतिनिधि सेट करते हैं और पुनः लोडडेटा कॉल करते हैं, शीर्ष पर 35px जगह होगी जो कभी भी दूर नहीं जाएगी।

इस परियोजना को देखें मैंने बग को प्रदर्शित किया: https://github.com/esilverberg/TableViewDelayedDelegateBug

विशेष रूप से यह फ़ाइल: https://github.com/esilverberg/TableViewDelayedDelegateBug/blob/master/TableViewDelayedDelegateBug/ViewController.m

यदि रेखा 24 सक्रिय है,

[self performSelector:@selector(updateDelegate) withObject:nil afterDelay:0.0];

शीर्ष पर एक अतिरिक्त 35 px स्थान होगा। यदि लाइन 27 सक्रिय है और 24 पर टिप्पणी की गई है,

self.tableView.delegate = self;

शीर्ष पर कोई स्थान नहीं। यह ऐसा है जैसे टेबल व्यू कहीं एक परिणाम को कैशिंग कर रहा है और डेलिगेट सेट होने और पुनः लोड होने के बाद खुद को फिर से शुरू नहीं कर रहा है।


21
मुझे लगता है कि भले ही एक प्रतिनिधि है, लेकिन प्रतिनिधि के tableView:heightForHeaderInSection:और tableView:heightForFooterInSection:रिटर्न 0 आप भी इस समस्या होगी। ऊपर प्रोटोकॉल विधियों को लागू करना और 0.01f को वापस करना मेरे लिए इसे तय किया।
जॉन एस्ट्रोपिया

1
हाँ!! मैंने 3 तथाकथित समाधानों की कोशिश की है, और यह एक था! शानदार, धन्यवाद: डी
हेनरिक एरलैंडसन

उत्तम। किसी ने बग की सूचना दी क्योंकि मुझे लगता है कि यह इच्छित व्यवहार नहीं है।
पुष्पराज

शानदार खोज! यह अभी भी ios 9 (हम XIB का उपयोग नहीं कर रहे हैं) में हो रहा है, लेकिन प्रतिनिधि को init पर सेट करने से रिक्ति तय हो गई (लोडव्यू या व्यूडीडलॉड में नहीं)। धन्यवाद!
जॉन स्ट्रीकर

1
हेडर के लिए एस्टीमेट सेट करने से मुझे मदद मिली
विक्टर

49

अनचेक "स्क्रॉल स्क्रॉल इनसेट समायोजित करें"

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


मुझे दूसरे व्यू कंट्रोलर के लिए इस विकल्प की आवश्यकता थी, और जाहिर है जब मैंने एक नया वीसी बनाया, तो यह बदलाव हुआ। इसके लिए धन्यवाद!
डेविड

हाँ! काम करता है, Justo ने इसे कंटेनर व्यू में सेट किया और काम किया!
फेलिप FMMobile

46

एक और त्वरित टिप्पणी ... यहां तक ​​कि XCode 6.1 में, एक बग है जिसमें ऊर्ध्वाधर रिक्त स्थान हैं, जो सबसे ऊपर दिखाई देता है UIScrollViews, UITextViewsऔर UITableViews

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

कभी-कभी, इस समस्या को ठीक करने का एकमात्र तरीका स्टोरीबोर्ड में जाना और समस्या नियंत्रण को खींचना है, इसलिए यह अब पृष्ठ पर पहला सबव्यू नहीं है ।

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

( इस दिशा में मुझे इंगित करने के लिए ओडेड को मेरा धन्यवाद ... मैं इस टिप्पणी को पोस्ट कर रहा हूं, बस कुछ स्क्रीनशॉट जोड़ने के लिए, लक्षणों को प्रदर्शित करने और ठीक करने के लिए।)


1
ध्यान दें कि यह बग, इर्रर, समस्या iOS 8 में भी होती है यदि आपके पास UITextView आपके पृष्ठ पर पहले उप-नियंत्रण के रूप में है ... तो यह केवल UITableView समस्या नहीं है।
माइक Gledhill

1
सभी समाधान में से केवल इस हैक ने मेरे लिए काम किया। एक अजीब बग के लिए एक अजीब तय। मैंने UITableview के साथ इस मुद्दे का सामना किया है।
मेसबाह

4
1 मिलियन धन्यवाद! यह एकमात्र समाधान है जिसने मेरे लिए काम किया।
user139816

1
(मैं इसके 18 महीने बाद आश्चर्यचकित हूं, और पाठक अभी भी इस जवाब को वोट कर रहे हैं। क्या एप्पल ने गंभीरता से अभी तक इस मुद्दे को तय नहीं किया है!)
माइक गिल्डहिल

1
मेरी ज़िंदगी बचाई! धन्यवाद। क्या आप जानते हैं कि इस साधारण छोटे "फिक्स" को खोजने में कितना समय लगा? grrh।
Mc.Stever

40

Apple द्वारा iOS7 के लिए इस ट्रांज़िशन गाइड के अनुसार , स्क्रॉल दृश्य की सामग्री इनसेट स्वचालित रूप से समायोजित हो जाती है। स्वचालित रूप से AdAdsscrollViewInsets का डिफ़ॉल्ट मान हां में सेट है।

UIViewController के पास UITableView है जो इस संपत्ति को NO पर सेट करना चाहिए।

self.automaticallyAdjustsScrollViewInsets = NO;

यह चाल चलेगा।

संपादित करें 1:

इसके अलावा, कोई भी कोशिश कर सकता है -

self.navigationController.navigationBar.translucent = YES;

यह शीर्ष पर अतिरिक्त पैडिंग को भी हटाता है।


बहुत अच्छा जवाब, जब तक कि यह सवाल का सही जवाब न दे। Esilver 35px गैप के बारे में बात करता है, लेकिन iOS7 अतिरिक्त 20px हेडर जोड़ता है: स्टेटस बार की ऊँचाई के बराबर।
मार्टिन

हास्यास्पद समस्या। जवाब के लिए धन्यवाद।
जिनी

यह एक अलग समस्या का जवाब है।
entonio

धन्यवाद, यह मेरे लिए काम किया, मेरे विशेष मामले में मेरे पास एक टेबलव्यू कंट्रौलर था, जो कि व्यू कॉन्ट्रोलर में एम्बेडेड था, और स्वचालित रूप से सेट करके। AdjustsScrollViewInsets = व्यू कॉन्ट्रोलर में झूठा शीर्ष अंतराल गायब हो गया
एलेक्सी

39

जब व्यू टेबल में इस्तेमाल किया जाता है तो बॉर्डर कटिंग से बचने के लिए इसका इस्तेमाल करें

self.tableView.contentInset = UIEdgeInsetsMake(-35, 0, 0, 0);

अन्य सभी की कोशिश की। यह वह है जिसने काम किया है! Thx
माइकल

36

ऊपर दिए गए पिछले जवाबों में से बहुत सारे हैक किए गए हैं। यदि भविष्य में Apple इस अप्रत्याशित व्यवहार को ठीक करने का निर्णय लेता है तो वे किसी भी समय टूट जाएंगे।

समस्या की जड़:

  1. एक UITableViewहेडर को 0.0 की ऊंचाई के साथ रखना पसंद नहीं है। यदि आप जो करने की कोशिश कर रहे हैं, वह 0 की ऊंचाई के साथ एक हेडर है, तो आप समाधान पर जा सकते हैं।

  2. भले ही बाद में आप अपने हेडर को नॉन 0.0 हाइट असाइन करते हैं UITableView, लेकिन पहली बार में आपको 0.0 की ऊंचाई के साथ हेडर दिया जाना पसंद नहीं है।

समाधान:

फिर, सबसे सरल और विश्वसनीय निर्धारण यह सुनिश्चित करना है कि जब आप इसे अपने टेबल व्यू पर असाइन करते हैं तो आपके हेडर की ऊंचाई 0 नहीं होती है।

कुछ इस तरह काम करेगा:

// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.tableView.bounds.size.width, CGFLOAT_MIN)];
self.tableView.tableHeaderView = tableViewHeaderView;

इस तरह से कुछ बिंदु पर इस मुद्दे को ले जाएगा (आमतौर पर, एक स्क्रॉल के बाद):

// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectZero];
self.tableView.tableHeaderView = tableViewHeaderView;

अंत में, मुझे वह उत्तर मिला जो काम करता है। धन्यवाद। इसके अलावा, मैंने सीखा है कि tableView.tableHeaderViewवास्तव में पंक्ति सामग्री के ऊपर एक सहायक दृश्य है। जब तक आपका उत्तर नहीं आया तब तक मैं सभी अनुभागों के मुखियाओं के साथ भ्रमित था।
जो हुआंग

1
CGFLOAT_MINCGFloat.leastNormalMagnitudeस्विफ्ट 3 के साथ बदल दिया गया है
क्ले एलिस

29

स्टोरीबोर्ड:

बस अनियंत्रित: Adjust Scroll View Insetsव्यू कंट्रोलर के विकल्पों में

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

कोड:

self.automaticallyAdjustsScrollViewInsets = false

2
Xcode 7 का उपयोग करते हुए मुझे अट्रैक्टर इंस्पेक्टर> लेआउट नहीं दिख रहा है, मुझे स्वयं को कहां जोड़ना चाहिए। AdjustsScrollViewInsets = false
alex

देखने में लोड था।
CW0007007

23

यह स्विफ्ट 3 का उपयोग कर iOS 10 के लिए समाधान है:

आप निम्नलिखित तरीकों को लागू करके शीर्ष और निचले पैडिंग से छुटकारा पा सकते हैं UITableViewDelegate

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
{ 
    return CGFloat.leastNormalMagnitude
}

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat
{
   return CGFloat.leastNormalMagnitude
}

SO पर दूसरे पेज ने मेरी मदद की .... मुझे पता नहीं क्यों, हो सकता है कि आॅटोमैडिमेंशन की वजह से, शायद VFL के साथ अड़चनों के कारण, किसी भी तरह, धन्यवाद! ओजी बुआ ist brav! : डी
पेंटारेक्स २१'१

ये सेक्शन हेडर और फुटर हैं। सवाल पूरे टेबल हेडर से संबंधित है। इसके अलावा, Swift3 या iOS 10 में से कोई भी डेलिगेट विधि नहीं है (वे हमेशा के लिए चारों ओर हैं)।
निकोलस मिआरी

14

मेरे मामले में यही मेरी मदद करता था। मैं ios6 का भी समर्थन कर रहा हूं।

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.extendedLayoutIncludesOpaqueBars = NO;
    self.automaticallyAdjustsScrollViewInsets = NO;
}

यकीन नहीं होता कि यह क्या करता है लेकिन इसने पूरी तरह से काम किया। क्या आप कुछ स्पष्टीकरण दे सकते हैं?
मैट वोल्फ

@MattWolfe मैं खो गया था, और इस समाधान को पाया, निश्चित रूप से या तो यह क्यों नहीं हो रहा है। मेरा अनुमान है कि नियंत्रक यह तय कर रहा है कि स्थिति पट्टी (या अन्य मामलों में टूलबार / टैबबार) के कारण टेबलव्यू को इनसेट की आवश्यकता है, इसलिए यह स्वचालित रूप से इसे जोड़ता है। मैं वास्तव में कुछ नए iOS7 "सुविधाओं" के साथ संघर्ष कर रहा हूं। शायद कोई इसे समझता है, और इस पर एक वास्तविक स्पष्टीकरण है?
लुकास

पिछले 2 दिनों को आईओएस 7 के लिए एक अपेक्षाकृत छोटे ऐप को पोर्ट करना और अभी भी छोटी समस्याएँ हैं। मैं इसे 7 में ठीक करता हूं और 6 में टूट जाता है और इसके विपरीत .. मुझे पागल कर रहा है!
मैट वोल्फ

यह ओपी की तुलना में एक अलग समस्या है। यहां तक ​​कि इसके साथ, समूहीकृत तालिका दृश्य के लिए, शीर्ष पर एक अतिरिक्त स्थान जोड़ा गया है।
राजवी

1
यह प्रमुख पंक्ति प्रतीत होती है: self.automaticallyAdjustsScrollViewInsets = NO; बस सेटिंग है कि मेरे पास अतिरिक्त जगह को हटा दिया।
माइक एम

14

बस अपने वीसी में अपने व्यूडीडलॉड के साथ निम्नलिखित जोड़ें:

self.automaticallyAdjustsScrollViewInsets = NO;

इस फिक्स ने काम किया और मैं इसे जादुई संख्याओं का उपयोग करके इनसेट्स को मैन्युअल रूप से सेट करना पसंद करता हूं। धन्यवाद!
imobilizer

14

इसलिए मैं यहां हर तरीके की कोशिश कर रहा था, और इस बार उनमें से किसी ने भी मदद नहीं की। मेरे मामले आईओएस 9. पर एक समूहीकृत तालिका दृश्य मैं वास्तव में नहीं जानता कि था क्यों और कैसे मैं इस एक में पता चला, लेकिन मेरे लिए, की स्थापना tableViewHeaderएक साथ UIViewकम से कम के साथ 0.01बाहर ऊंचाई काम किया। CGRectZeroमदद नहीं की, कुछ भी नहीं वास्तव में मदद की:

tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: 0.01))

10

स्विफ्ट: आईओएस मैं स्क्रॉल व्यू पर टेबलव्यू था .. जब मैं एक ही स्क्रीन पर "बैक" पर क्लिक कर रहा था। स्क्रॉल दृश्य शीर्ष पर अधिक स्थान लेता है .. इसे हल करने के लिए जिसका मैंने उपयोग किया है:

 self.automaticallyAdjustsScrollViewInsets = false

एक बूलियन मान जो इंगित करता है कि क्या दृश्य नियंत्रक को अपने स्क्रॉल दृश्य इनसेट को स्वचालित रूप से समायोजित करना चाहिए या नहीं। डिफ़ॉल्ट मान सत्य है, जो व्यू कंट्रोलर को स्टेटस बार, नेविगेशन बार और टूलबार या टैब बार द्वारा खपत स्क्रीन क्षेत्रों के जवाब में अपने स्क्रॉल व्यू इनसेट को समायोजित करने की अनुमति देता है। यदि आप स्क्रॉल दृश्य इनसेट समायोजन को स्वयं प्रबंधित करना चाहते हैं तो गलत पर सेट करें, जैसे कि दृश्य पदानुक्रम में एक से अधिक स्क्रॉल दृश्य होने पर।


10

@Aurelien Porte द्वारा उत्तर के लिए धन्यवाद। यहाँ मेरा समाधान है

इस मुद्दे का कारण: -

  1. UITableView 0.0 की ऊंचाई के साथ हेडर रखना पसंद नहीं करता है। यदि आप जो करने की कोशिश कर रहे हैं, वह 0 की ऊंचाई के साथ एक हेडर है, तो आप समाधान पर जा सकते हैं।
  2. भले ही बाद में आप अपने हेडर को नॉन 0.0 हाइट असाइन करते हों, UITableView पहली बार में 0.0 की हाइट वाले हेडर को देना पसंद नहीं करता है।

ViewDidLoad में: -

self.edgesForExtendedLayout = UIRectEdge.None

self.automaticallyAdjustsScrollViewInsets = false

कुछ इस तरह की आवश्यकता नहीं है: -

self.myTableview.contentInset = UIEdgeInsetsMake(-56, 0, 0, 0)

में heightForHeaderInSectionप्रतिनिधि: -

if section == 0
    {
        return 1
    }
    else
    {
        return 40; // your other headers height value
    }

में viewForHeaderInSectionप्रतिनिधि: -

if section == 0 
{  
   // Note CGFloat.min for swift
   // For Objective-c CGFLOAT_MIN 
   let headerView = UIView.init(frame: CGRectMake(0.0, 0.0, self.myShaadiTableview.bounds.size.width, CGFloat.min)) 
   return headerView
}
else
{ 
   // Construct your other headers here 
}

10

इस तरह इसे स्टोरीबोर्ड के माध्यम से iOS 11 और Xcode 9.1 में आसानी से तय किया जा सकता है :

तालिका दृश्य> आकार निरीक्षक> सामग्री का चयन करें: कभी नहीं


1
मेरे लिए काम किया :)
bhupinder

महान! धन्यवाद :)
सईद इर

1
इसके बजाय automaticallyAdjustsScrollViewInsetsios 11
निक कोव

9

मैं मान रहा हूं कि यह नई UITableViewStyleGroupedस्टाइल का हिस्सा है । यह सभी समूहीकृत तालिका दृश्यों में है और उस स्थान को नियंत्रित करने का कोई सीधा तरीका नहीं है।

यदि उस स्थान का प्रतिनिधित्व किया जा रहा है UIView, तो उस विशिष्ट दृश्य को खोजने और उसे सीधे संपादित करने subviewsके UITableViewलिए सभी के माध्यम से खोज करना संभव होगा । हालांकि, इस बात की भी संभावना है कि हेडर और सेल शुरू होने से पहले वह जगह एक हार्डकोड ऑफसेट है और इसे संपादित करने का कोई तरीका नहीं होगा।

सभी साक्षात्कारों के माध्यम से खोज करने के लिए (मैं इस कोड को तब चलाऊंगा जब तालिका में कोई सेल न हो, जिससे आउटपुट को पढ़ना थोड़ा आसान हो):

- (void)listSubviewsOfView:(UIView *)view {

    // Get the subviews of the view
    NSArray *subviews = [view subviews];

    // Return if there are no subviews
    if ([subviews count] == 0) return;

    for (UIView *subview in subviews) {

        NSLog(@"%@", subview);

        // List the subviews of subview
        [self listSubviewsOfView:subview];
    }
}

3
अगर UITableViewCellScrollViewiOS7 पर UITableViews (अधिक विशिष्ट होने के लिए ) ने हमें एक चीज सिखाई है, तो यह केवल कक्षाओं में निर्मित दृश्य पदानुक्रम को छोड़ना है।
माथियास बाउच

अच्छी बात। दूसरा विकल्प है ... प्रत्येक आईओएस के लिए हैकिंग रखना;)
डैन रोसेनस्टार्क

उफ़, हाँ। उस चेतावनी को लिखने का मतलब है लेकिन भूल गए।
केविन

केविन - मुझे लगता है कि आप सही हैं, यह डिजाइन द्वारा है। ऐसा प्रतीत होता है कि ऊँचाई के लिए 0 लौटनाफेयरइन्डर इन पेडिंग को हटाने का सबसे आसान तरीका है। उस विशेष उदाहरण पर किसी कारण से यह मेरे लिए काम नहीं कर रहा था, लेकिन यह अन्य UITableViews पर काम करता है।
अनुगामी

1
यह निश्चित रूप से "डिजाइन द्वारा" है। यदि आपने निष्पादन को रोक दिया है और भाग गया है: po [((UIApplication *)UIApplication.sharedApplication).keyWindow recursiveDescription]आप देखेंगे कि टेबल हेडर, या फर्स्ट सेक्शन हेडर, या फर्स्ट सेल (आप जो उपयोग करते हैं, उसके आधार पर) स्वाभाविक रूप से 35px बॉर्डर छोड़ देता है .... बू।
श्री टी।

9

मेरा उत्तर अधिक सामान्य उत्तर होने वाला है, लेकिन इस पर भी लागू किया जा सकता है।

यदि रूट दृश्य ( ViewController ) या रूट दृश्य का पहला बच्चा (सबव्यू) UIScrollView (या UIScrollView खुद) का उपवर्ग है, और यदि

self.navigationController.navigationBar.translucent = YES;

ढांचा स्वचालित रूप से पूर्व-गणना की गई सामग्री को सेट करेगा ।


इससे बचने के लिए आप कर सकते हैं

self.automaticallyAdjustsScrollViewInsets = NO;

लेकिन मेरे मामले में मैं ऐसा करने में सक्षम नहीं था, क्योंकि मैं SDK को लागू कर रहा था जिसमें UIView घटक है जो अन्य डेवलपर्स द्वारा उपयोग किया जा सकता है। उस UIView घटक में UIWebView (जिसमें पहला सबव्यू के रूप में UIScrollView है)। यदि उस घटक को UIViewController के पदानुक्रम में पहले बच्चे के रूप में जोड़ा जाता है, तो स्वचालित इनसेट सिस्टम द्वारा लागू किया जाएगा।

मैंने UIWebView को जोड़ने से पहले फ्रेम (0,0,0,0) के साथ डमी दृश्य जोड़कर इसे ठीक किया है।

इस मामले में सिस्टम को पहले सबव्यू के रूप में UIScrollView का उपवर्ग नहीं मिला और इनसेट लागू नहीं हुए


जीवन रक्षक! धन्यवादself.automaticallyAdjustsScrollViewInsets = false
ethanneff

8

इस कोड ने मेरे लिए काम किया, मेरे लिए सबसे अच्छा जवाब जो objective-Cअप-साइड में लिखा गया था इसलिए मैंने इसे स्विफ्ट में बदल दिया।

स्विफ्ट के लिए 4.0+

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: 0.01))

बस इस में लिखें viewDidLoad()और यह एक आकर्षण की तरह काम करेगा।


1
बहुत बहुत धन्यवाद, मेरे लिए ठीक काम किया।
.ÂÂÂÂ

1
आपका स्वागत है खुश कोडिंग
विपुल कुमार

7

मुझे एरीलीज़ के समान ही ठीक करना था। एक बार जब मैंने UITableView को मूल दृश्य का पहला सबव्यू नहीं बनाया, तो यह चला गया। मेरा स्थान 20 पीएक्स था, न कि 35।

मैं एक चित्र xib में इसे फिर से बनाने में सक्षम नहीं था, केवल एक परिदृश्य xib। अगर मैं इसे एक साधारण डेमो ऐप में पुन: पेश कर सकता हूं तो मैं बाद में रडार बग दर्ज करूंगा।


एक ही मुद्दे में भाग, सामग्री को बदलने से इसे हल करने में सक्षम नहीं था। लेकिन इस विधि ने काम किया, भले ही यह बहुत हैकी हो। विजुअल डिबगिंग टूल का उपयोग करने के लायक यह है कि मैं यह देख पा रहा था कि UITableView की सही ऊंचाई होने के बावजूद, इसके अंदर UITableViewWrapper नहीं था।
माइक्रो फॉक

उत्तम। इसने मेरे लिए बग फिक्स किया, XCode 6.1 में। इस StackOverflow पृष्ठ में किसी भी अन्य सुझाव से कोई फर्क नहीं पड़ा। मेरे पास एक UIVIV के भीतर एक UITableView था, और यह पहला सबव्यू था। दूसरा सबव्यू बनने के लिए इसे खींचने से यह पूरी तरह तय हो गया। (अगर किसी को मेरी ज़रूरत है, तो मैं पब में रहूँगा।)
माइक गल्डहिल

धन्यवाद! यह तब भी काम करता है जब आपके पास कंटेनर के भीतर टेबल व्यू कंट्रोलर हो। कंटेनर को ले जाना ताकि उसके माता-पिता के दृश्य में पहला न हो, तालिका दृश्य के शीर्ष पर अंतर को हटा दें।
गलाघोंटू

7

मुझे लगता है कि UIEdgeInsets -35 0 0 0 बनाना थकाऊ है। मेरे मामले में, मैंने tableView: heightForHeaderInSection: विधि लागू की और इसमें 0 वापस करने की क्षमता है।

जब मैंने 0 से 0.1f बदल दिया, तो समस्या बस चली गई।


1
अगर मैं कर सकता था, तो मैं इसे एक से अधिक बार बढ़ाऊंगा। एक अजीब ऑटोलैयट गड़बड़ या कुछ और होना चाहिए ... जैसा कि कुछ भी> 0 काम करता है, मैं सुझाव देता हूं कि आप 0.1 के बजाय FLT_EPSILON या DBL_EPSILON का उपयोग करें, दोनों को देखते हुए छोटे सकारात्मक मान का प्रतिनिधित्व करते हैं जैसे कि 1.0 +
एप्सन

7

केवल एक चीज जो मेरे लिए काम करती थी:

स्विफ्ट :

tableView.sectionHeaderHeight = 0
tableView.sectionFooterHeight = 0

उद्देश्य-सी :

self.tableView.sectionHeaderHeight = 0;
self.tableView.sectionFooterHeight = 0;

इसके अलावा, मेरे पास पहले खंड के लिए अतिरिक्त जगह थी। ऐसा इसलिए था क्योंकि मैं इस्तेमाल कर रहा थाtableHeaderView गलत तरीके संपत्ति । जिसे जोड़कर निश्चित किया:

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 0.01))

मेरे लिए स्विफ्ट 4.2 के लिए काम करता है। धन्यवाद
ज़ाईलर

इस पृष्ठ में सब कुछ की कोशिश की, iOS13 के लिए हेडर दृश्य के साथ टेबलव्यू समूहीकृत किया। self.tableView.tableHeaderView = UIView (फ्रेम: CGRect (x: 0, y: 0, चौड़ाई: tableView.frame.size. उपलब्धता, ऊंचाई: 0.01))। मुद्दा तय किया।
निंग

7

स्विफ्ट 4 कोड: बिना किसी हेडर वाले टेबलव्यू के लिए आप इस कोड को जोड़ सकते हैं:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}

और आपको हेडर रिक्ति 0 पर मिलेगा।

यदि आप अपनी विशिष्ट ऊँचाई का शीर्षलेख चाहते हैं, तो उस मान को पास करें:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return header_height
}

और viewForHeaderinSection प्रतिनिधि से दृश्य।


इस सवाल का जवाब नहीं है। सवाल यह था कि अतिरिक्त रिक्ति कहाँ से आ रही है, इससे छुटकारा कैसे नहीं।
स्टीफन नेवेल

अजीब बात यह है कि यदि u ऊँचाई में 0 रिटर्नफॉरहेडरएक्शन स्नेह यू अभी भी इस अतिरिक्त स्थान को प्राप्त करता है। यह CGFloat.leastNormalMagnitude (कम से कम सकारात्मक संख्या) के साथ एकदम सही काम करता है
ShadeToD

7

विशिष्ट होने के लिए, ऊपर से टेबलव्यूहेडर स्पेस हटाने के लिए मैंने ये बदलाव किए हैं:

YouStoryboard.storyboard> YouViewController> TableView> साइज इंस्पेक्टर> कंटेंट इनसेट का चयन करें - इसे कभी सेट न करें।

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


इस उत्तर की तुलना में स्क्रीनशॉट के अलावा अन्य अतिरिक्त जानकारी क्या है ?
आर्टजोम बी।

यह वही है जो मुझे लगता है, मुझे वह जवाब नहीं मिला जब मैं एक समाधान की तलाश में था। क्या मुझे अपना उत्तर हटा देना चाहिए ..?
user832

यह नहीं कि आप अपने उत्तर पर थोड़ा विस्तार कर सकते हैं कि क्यों सामग्री के लिए = वास्तव में इस मुद्दे को हल नहीं करता है (यह विकल्प कैसे काम करता है?)।
आर्टजोम बी।

जब सामग्री इनसेट को कभी सेट नहीं किया जाता है, तो टेबल व्यू टेक्स्टफिल्ड एडिटिंग पर स्क्रॉल नहीं करेगा।
मोजतबा अल मौसवी

6

इस एक का उपयोग करें मुझे लगता है कि यह मदद ...

 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
 {
    return 0.005f;// set this according to that you want...
 }

1
प्रतिभाशाली! IOS 9.2 में एक आकर्षण की तरह काम करता है। यह उत्तर एकदम सही है क्योंकि कुछ मामलों में मुझे पहले शीर्षलेख को दबाने की आवश्यकता है जबकि अन्य इसे दिखाते हैं। मैंने CGFloat.min का उपयोग करते हुए एक और उत्तर देखा, जो काम भी करता है। इसलिए मेरा विचार नियंत्रक अब या तो एक वास्तविक संख्या की आपूर्ति कर सकता है जैसे कि 44.0 या अनिवार्य रूप से 0.
डेविड एच

6
override func viewWillAppear(animated: Bool) {
        self.edgesForExtendedLayout = UIRectEdge.None

 //  OR

self.sampleTableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0);

   //OR

 self.automaticallyAdjustsScrollViewInsets = false
        }

स्वचालित रूप से AdjustsScrollViewInsets = मुझसे गलत काम! धन्यवाद!
डैनियल कुटा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.