IOS7: UINavigationController में UIScrollView ऑफसेट


126

मैं वर्तमान में ios 7 पर अपने ऐप को माइग्रेट कर रहा हूं और मैं नए नेविगेशन कॉन्ट्रैक्टर / बार प्रबंधन पर घंटों के लिए अटक गया हूं।

इससे पहले, जब हमारे पास एक नेविगेशन नियंत्रक था, तो हमारे पास इस तरह का एक स्निपेट था:

UINavigationController *navController = [[UINavigationController alloc]initWithRootViewController:[[MainViewController alloc]init]];

इंटरफ़ेस बिल्डर में, हमारे पास दृश्य के लिए मौजूदा नेविगेशनबार सेट करने का विकल्प था और सब कुछ वास्तविक दृश्य की सामग्री से मेल खाता है।

ठीक है अब, मैं कैसे इंटरफ़ेस बिल्डर के साथ ठीक से डिजाइन करने के लिए कोई सुराग नहीं है। मेरे पास अभी भी मेरे स्निपेट हैं ताकि मैं अपने नौसैनिकों को शुरू कर सकूं। हालाँकि मैं अपने MainViewController के लिए इंटरफ़ेस बिल्डर में यदि मैं पारभासी या अपारदर्शी नेविगेशन बार के लिए एक स्थिति पट्टी सेट करता हूं, तो मेरे पास शीर्ष पर 44px की ऑफसेट (नीचे देखें) है।


इंटरफ़ेस बिल्डर _________________________ और परिणाम


अब, अगर मैं किसी को भी स्टेटस बार सेट करता हूं, तो शीर्ष पर कोई ऑफसेट नहीं है, लेकिन चूंकि सिम्युलेटर पर दृश्य छोटा है, इसलिए नेविगेशन बार के कारण इंटरफ़ेस बिल्डर में दृश्य का निचला भाग कट जाता है।

इंटरफ़ेस बिल्डर _________________________ और परिणाम

मुझे लगता है मैं वास्तव में यहाँ कुछ याद कर रहा हूँ, लेकिन मैं किसी भी विषय या Apple जानकारी के बारे में iOS7 संक्रमण गाइड में नहीं मिल सकता है।

आपकी सहायता के लिए धन्यवाद


संपादित करें

जैसा कि हम चित्रों में देख सकते हैं, दृश्य का पहला बच्चा एक UIScrollView है जिसमें दोनों लेबल होते हैं, स्क्रॉल नहीं होने पर समस्या प्रकट नहीं होती है। यह भी दिखाई देता है अगर यह एक UITableView है। यदि कोई लेबल UIScrollView के बाहर है, तो उस लेबल पर कोई ऑफ़सेट नहीं है।


यदि आप नहीं हैं, तो आप ऑटोलयूट का उपयोग करना चाह सकते हैं, इसलिए आप यह सुनिश्चित कर सकते हैं कि कुछ दृश्य स्क्रीन के ऊपर / नीचे / किनारे से दूर एक सेट दूरी पर हैं
erdekhayser

मैं वास्तव में Autolayout का उपयोग नहीं कर रहा हूं, लेकिन इसका उपयोग करके (चेकबॉक्स को टिक कर) समस्या का समाधान नहीं करता है।
streem

Autolayout के साथ, आपको विचारों के स्थान पर बने रहने के लिए बाधाओं को निर्धारित करना चाहिए। Xcode को नहीं पता है कि आप अपने आप क्या चाहते हैं।
erdekhayser

आपके पिछले संपादन को देखकर, मैंने अभी आपका मुद्दा खोजा है। दुर्भाग्य से, यह सबसे स्पष्ट समाधान नहीं है। यह सब फिर से समझाने की कोशिश करने के बजाय, मैंने इस वीडियो का उपयोग Youtube पर किया है ताकि यह सीख सकें कि स्क्रॉल दृश्य कैसे सेट करें। youtube.com/watch?v=PgeNPRBrB18&feature=youtu.be गुड लक। इसे पूरी तरह से समझने के लिए कि वह क्या कर रहा है, इसे देखने के लिए मुझे कुछ समय लगा।
erdekhayser

जवाबों:


286

ठीक है, इसलिए मैंने समाधान पाया, मैंने अपने नियंत्रक में संपत्ति सेट की है:

self.automaticallyAdjustsScrollViewInsets = false

मैं वास्तव में इस संपत्ति के असली लाभ को नहीं समझता, (या डिफ़ॉल्ट मूल्य क्यों सच है)

एकमात्र दस्तावेज जो मुझे मिला वह था:

अपडेट करें

IOS 11 automaticallyAdjustsScrollViewInsetsमें पदावनत किया गया है

अब आपको उपयोग करना चाहिए:

self.tableView.contentInsetAdjustmentBehavior = .never

मैं आपको उन गुणों की बेहतर समझ प्राप्त करने के लिए इस प्रश्न और इसके उत्तर की जांच करने के लिए प्रोत्साहित करता हूं


12
शानदार खोज। स्टोरीबोर्ड में UIScrollView वास्तव में जटिल है। काश Apple Xcode के भविष्य के संस्करणों में इसे थोड़ा सहज बनाता।
p0lAris

4
यह कोड मेरे UIScrollViewस्क्रॉल करने से रोकता है । लेकिन इसके बिना मैं ऑफ़सेट से छुटकारा नहीं पा सकता। खरपतवार ...
डरावना

9
इस ध्वज को आपके स्टोरीबोर्ड / नीब में भी स्विच किया जा सकता है, व्यू कंट्रोलर के पास "एडजस्ट स्क्रॉल स्क्रॉल इनसेट" चेकबॉक्स है। मैं इतनी देर तक एक दीवार के खिलाफ अपना सिर पीटता रहा हूं, अब स्क्रॉल विचारों और ऑटो लेआउट के साथ अपनी समस्याओं को हल करने की कोशिश कर रहा हूं, आगे आईओएस 6 और 7. का समर्थन करके जटिल है और अंत में एक समाधान प्रदान करने के लिए बहुत बहुत धन्यवाद!
न्यूटज

2
ऐप डॉक्यूमेंट आपको बताएगा कि नेवीगेशनबार.ट्रानसुलेटेंट = वाईईएस सेट करने से नेविगेशनबार को कंटेंट को नीचे धकेलने से रोका जा सकेगा। यह सबसे बड़ा झूठ है और मुझे इस पद तक कई घंटे काम करने में खर्च हुआ। इसके अलावा, आपको self.automaticallyAdjustsScrollViewInsets = NO सेट करना होगा; इस पोस्ट के लिए आपका बहुत - बहुत धन्यवाद!!!!!!! सेब और सेब?
user779764

मैंने पाया कि इसने मेरे UIScrollView की सीमा को बार बार (-64 पॉइंट) की ऊंचाई से नीचे स्थानांतरित कर दिया। मैंने इसे 0 पर मैन्युअल रूप से ओवररोड किया है, लेकिन पाया कि UISrollView अभी भी y- अक्ष में स्क्रॉल करेगा, और -64 पर काल्पनिक रेखा पर "स्नैप" करेगा। आपके समाधान ने इसे हल कर दिया।
gdbj

92

@ जस्टफ़िंगर के जवाब ने मेरे लिए भी एक आकर्षण की तरह काम किया।

बस यह जोड़ना चाहता था कि इस सेटिंग को इंटरफ़ेस बिल्डर से भी आसानी से समायोजित किया जा सकता है।

  1. अपना व्यू कंट्रोलर चुनें
  2. 'गुण निरीक्षक' टैब पर क्लिक करें
  3. अनचेक करें 'स्क्रॉल स्क्रॉल इनसेट समायोजित करें'
  4. का आनंद लें!

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


UIScrollView संपत्तियों में इस विकल्प की तलाश में उम्र बिताने वाले और देखने वाले नहीं! धन्यवाद!
डोमिनिक विलियम्स

11

मैं इसी मुद्दे में चल रहा था, लेकिन मुझे इंटरफ़ेस बिल्डर में ViewController पर एक बल्कि अजीब संपत्ति मिली जो लगता है कि यह मेरे लिए पैदा कर रहा है। चेक बॉक्स का एक "विस्तार किनारों" सेट है। मैंने "अंडर टॉप बार्स" चेक को हटा दिया, और सब कुछ मेरे लिए ठीक से रखना शुरू कर दिया।


हाँ, इसने मेरे लिए "एडजस्ट स्क्रॉल व्यू इनसेट्स" से बेहतर काम किया
Dmytro

2

स्वचालित रूप से AdAdsscrollViewInsets के साथ YES (डिफ़ॉल्ट सेटिंग) पर सेट किया गया है, ios6 और ios7 के बीच स्क्रॉल स्थिति में एक बेमेल है, इसलिए उन्हें सुसंगत बनाने के लिए आपको इस सेटिंग को अक्षम करने की आवश्यकता है। हालाँकि, ios6 दुर्घटनाग्रस्त हो जाएगा यदि यह स्वचालित रूप से आता है AdjustsScrollViewInsets, तो आपको या तो स्वचालित रूप से एक क्रमिक परिवर्तन करने की आवश्यकता है IOS7 पर स्वचालित रूप से AdAdsscrollViewInsets सशर्त या अन्यथा स्टोरीबोर्ड / NIB का उपयोग करके विकल्प बंद करें


2

मेरे पास एक समान समस्या थी, एक दृश्य नियंत्रक को हटाने के बाद, मेरे तालिका दृश्य से सामग्रीऑफ़सेट (0, -64) में बदल दिया गया था।

मेरा समाधान थोड़ा अजीब था, मैंने अन्य सभी उत्तरों की कोशिश की, लेकिन कोई सफलता नहीं मिली, केवल एक चीज जो मेरी समस्या को ठीक करती थी वह थी। xib के नियंत्रण ट्री में tableView स्थिति स्विच करना।

यह इस तरह माता पिता में पहला नियंत्रण था:

इससे पहले

मैंने ImageView के ठीक बाद tableView स्थानांतरित किया और यह काम किया:

उपरांत

ऐसा लगता है कि पहली स्थिति में टेबल व्यू डालने से परेशानी हो रही थी, और टेबल व्यू को दूसरी स्थिति में ले जाने से समस्या ठीक हो गई।

PD मैं न तो स्टोरीलैट का उपयोग कर रहा हूं और न ही स्टोरीबोर्ड का

उम्मीद है कि यह किसी की मदद कर सकता है!


मैंने इस अजीब व्यवहार पर ध्यान दिया, मुझे विश्वास है कि पीछे का तर्क यह है कि जब एक स्क्रॉलव्यू पहला बच्चा होता है, तो स्क्रॉलव्यूसेट्स स्वचालित रूप से अन्यायपूर्ण होते हैं। अन्यथा यह वास्तव में कोई मतलब नहीं है क्योंकि आपके स्क्रॉलव्यू प्रोबाय है न कि पूर्ण स्क्रीन।
स्ट्रेम

1

मुझे भी इस समस्या का सामना करना पड़ता है।

UIScrollView सामग्री के आकार की गणना OS द्वारा अन्य आकारों के रूप में की जाती है, इसकी उत्पत्ति बाधा प्रणाली द्वारा प्रदान की गई है - यही कारण है कि OS में संदेह है।

कैसे ठीक करें - आपको सामग्री के आकार को स्पष्ट रूप से परिभाषित करना चाहिए UIScrollView:

  1. स्क्रॉल करने योग्य सामग्री एम्बेड करें UIView(मैं इसका नाम बदलकर ContentView)
  2. बाधाएं जोड़ें:

ContentView.Weight = View.Weight तथा ContentView.Height = View.Height

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


0

ऐसा लगता है कि समाधान के चारों ओर एक कार्य स्टोरीबोर्ड फ़ाइल को "iOS 6.1 और पहले" के रूप में देखना है (स्टोरीबोर्ड फ़ाइल चुनें -> फ़ाइल इंस्पेक्टर-> इंटरफ़ेस बिल्डर दस्तावेज़-> इस रूप में देखें। इस मोड में पोज़िशनिंग सबवेज़ ऑफ़सेट दिखाता है।


वैसे, मैं स्टोरीबोर्ड का उपयोग नहीं कर रहा हूं। हालाँकि मुझे यकीन नहीं है कि यह ios6 से ios7 की समस्या है, ऊपर का उदाहरण पूरी तरह से iOS 7 के साथ बनाया गया है। इसके अलावा, मैंने अपना प्रश्न संपादित किया, यह केवल (जहाँ तक मुझे पता है) uiscrollview और uitableview के साथ दिखाई देता है।
streem

हम्म दिलचस्प ... इसे देखते हुए आप दस्तावेज़ तत्व में XIB के शीर्ष पर variant = "6xAndEarlier" जोड़ सकते हैं, क्योंकि यह अंतर है जब मैंने ऊपर बताए गए बिट को फ़्लिप किया। और FYI करें यह मुद्दा मेरे लिए uiwebview के लिए भी होता है।
स्वेतमान

0

समाधान के लिए धन्यवाद दोस्तों! मैं समस्या के समाधान के लिए घंटों संघर्ष करता रहा। सब कुछ ठीक था जब कोई नेविगेशन बार शामिल नहीं था, लेकिन यह उस क्षण से बहुत ही कम हो गया जब मैंने एक नेविगेशनकंट्रोलर में ViewController को एम्बेड किया।

मैंने इसे एडजस्ट स्क्रॉल स्क्रॉल इनसेट्स और अंडर टॉप बार्स को अनचेक करके हल किया । ये दोनों ViewController के अटेंडेंट इंस्पेक्टर में स्थित हैं। बहुत - बहुत धन्यवाद!

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