स्वचालित रूप से अंतर के बारे में बताते हुए AdAdsscrollViewInsets, ExtendedLayoutIncludesOpaqueBars, किनारों को iOS7 में संपादित करें


250

मैं iOS7 UI संक्रमण के बारे में बहुत कुछ पढ़ रहा हूं।

मैं इन क्या तीन गुण प्राप्त करने में सक्षम नहीं हूँ automaticallyAdjustsScrollViewInsets, extendedLayoutIncludesOpaqueBars, edgesForExtendedLayout??

उदाहरण के लिए मैं अपने विचार नियंत्रकों को स्टेटस बार के नीचे शुरू करने की कोशिश कर रहा हूं लेकिन मैं इसे हासिल नहीं कर पा रहा हूं।


5
और आप सोचेंगे कि मैंने ऐसा क्यों नहीं पढ़ा? .. समस्या यह है कि उम्मीद के मुताबिक काम नहीं कर रहा है जैसा कि मैंने इसे अच्छी तरह से नहीं समझा है !! .. कारण
user1010819

1
ओह्ह मैंने गलत समझा कि आप वहाँ क्या कह रहे थे। मैं संरक्षक बनाने की कोशिश नहीं कर रहा था, यह सिर्फ इतना है कि जब कुछ लोग इस तरह के सवाल पूछते हैं, और साइट पर नए होते हैं, तो वे स्पष्ट समाधान याद करते हैं।
erdekhayser

8
अपने व्यूडलॉड विधि में, यदि ([सेल्फ रेस्पोंडिटोसलेटर: @selector (edgeForExtendedLayout)]) self.edgesForExtendedLayout = UIRectddgeNone जोड़ें; जो आपके विचार को स्टेटस बार से नीचे शुरू करने के लिए मजबूर करेगा।
नंद

जवाबों:


629

IOS7 में शुरू, व्यू कंट्रोलर डिफ़ॉल्ट रूप से फुल-स्क्रीन लेआउट का उपयोग करते हैं। उसी समय, आपके पास इस बात पर अधिक नियंत्रण होता है कि वह अपने विचारों को किस प्रकार प्रस्तुत करता है, और यह उन गुणों के साथ किया जाता है:

edgesForExtendedLayout

मूल रूप से, इस संपत्ति के साथ आप सेट करते हैं कि आपके दृश्य के किन पक्षों को पूरे स्क्रीन को कवर करने के लिए बढ़ाया जा सकता है। कल्पना करें कि आप एक UIViewControllerमें धक्का देते हैं UINavigationController। जब उस दृश्य नियंत्रक का दृश्य बाहर रखा जाता है, तो वह शुरू हो जाएगा जहां नेविगेशन बार समाप्त होता है, लेकिन यह गुण सेट करेगा कि दृश्य के शीर्ष (ऊपर, बाएं, नीचे, दाएं) को पूरे स्क्रीन को भरने के लिए बढ़ाया जा सकता है।

इसे एक उदाहरण के साथ देखते हैं:

UIViewController *viewController = [[UIViewController alloc] init];
viewController.view.backgroundColor = [UIColor redColor];
UINavigationController *mainNavigationController = [[UINavigationController alloc] initWithRootViewController:viewController];

यहां आप मान सेट नहीं कर रहे हैं edgesForExtendedLayout, इसलिए डिफ़ॉल्ट मान लिया गया है ( UIRectEdgeAll), इसलिए दृश्य पूरे स्क्रीन को भरने के लिए इसके लेआउट का विस्तार करता है।

यह परिणाम है:

विस्तारित लेआउट के लिए किनारों के बिना, दृश्य पूरी स्क्रीन को भरता है

जैसा कि आप देख सकते हैं, लाल पृष्ठभूमि नेविगेशन बार और स्टेटस बार के पीछे फैली हुई है।

अब, आप उस मान को सेट करने जा रहे हैं UIRectEdgeNone, इसलिए आप स्क्रीन को कवर करने के लिए दृश्य को न बढ़ाने के लिए व्यू कंट्रोलर को बता रहे हैं:

UIViewController *viewController = [[UIViewController alloc] init];
viewController.view.backgroundColor = [UIColor redColor];
viewController.edgesForExtendedLayout = UIRectEdgeNone;
UINavigationController *mainNavigationController = [[UINavigationController alloc] initWithRootViewController:viewController];

और परिणाम:

किनारों के साथसुधार के लिए सेटआउट, दृश्य सिर्फ नेविगेशन के तहत है


automaticallyAdjustsScrollViewInsets

इस संपत्ति का उपयोग तब किया जाता है जब आपका दृष्टिकोण एक जैसा UIScrollViewया समान होता है, जैसे UITableView। आप चाहते हैं कि आपकी तालिका प्रारंभ हो जाए जहां नेविगेशन बार समाप्त हो जाए, क्योंकि आप पूरी सामग्री को नहीं देखेंगे या नहीं, लेकिन साथ ही आप चाहते हैं कि आपकी तालिका स्क्रॉल करते समय पूरी स्क्रीन को कवर करे। उस स्थिति में, edgesForExtendedLayoutकोई भी काम करने से काम नहीं चलेगा क्योंकि आपकी तालिका स्क्रॉल करना शुरू कर देगी जहां नेविगेशन बार समाप्त होता है और यह इसके पीछे नहीं जाएगा।

यह वह जगह है जहां यह संपत्ति काम में आती है, यदि आप व्यू कंट्रोलर को स्वचालित रूप से इनसेट्स को समायोजित करने देते हैं (इस प्रॉपर्टी को YES, यह भी डिफॉल्ट वैल्यू पर सेट करें) यह इनसेट्स को टेबल के ऊपर जोड़ देगा, इसलिए टेबल जहां से शुरू होगी, वहां नेविगेशन बार समाप्त होता है, लेकिन स्क्रॉल पूरे स्क्रीन को कवर करेगा।

यह तब होता है जब NO पर सेट किया जाता है:

तालिका पूरी स्क्रीन पर स्क्रॉल होगी, लेकिन आंशिक रूप से कवर की गई है

और हाँ (डिफ़ॉल्ट रूप से):

तालिका पूरे स्क्रीन पर स्क्रॉल करती है, और बस नेविगेशन के तहत शुरू होती है

दोनों ही मामलों में, तालिका नेविगेशन बार के पीछे स्क्रॉल करती है, लेकिन दूसरे मामले (YES) में, यह नेविगेशन बार के नीचे से शुरू होगी।


extendedLayoutIncludesOpaqueBars

यह मान पिछले वाले का एक जोड़ है। डिफ़ॉल्ट रूप से, यह पैरामीटर NO पर सेट है। यदि स्थिति पट्टी अपारदर्शी है, विचारों भले ही आप इसे (कवर करने के लिए आपके विचार का विस्तार स्थिति पट्टी में शामिल करने के लिए बढ़ाया नहीं किया जाएगा, edgesForExtendedLayoutकरने के लिए UIRectEdgeAll)।

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

यदि कुछ स्पष्ट नहीं है, तो एक टिप्पणी लिखें और मैं इसका उत्तर दूंगा।

IOS कैसे जानता है कि UIScrollView का उपयोग क्या है?

iOS आपके ViewController के पहले सबव्यू को पकड़ लेता है, जो कि इंडेक्स 0 पर होता है, और अगर यह सबक्लास है, UIScrollViewतो इसके लिए समझाया गया गुण लागू करता है।

बेशक, इसका मतलब यह है कि UITableViewControllerडिफ़ॉल्ट रूप से काम करता है (चूंकि UITableViewयह पहला दृश्य है)।


हमें यह गुण सेट करने की आवश्यकता है केवल, यदि हम डिफ़ॉल्ट नेविगेशन बार दिखा रहे हैं, और नहीं तो क्या इसके अनुकूलित नेविगेशन बार, सही?
हेमांग

1
नहीं, यदि आप iOS नेविगेशन बार का उपयोग करते हैं लेकिन अपने स्वयं के डिज़ाइन के साथ आपको समान गुणों का उपयोग करने की आवश्यकता होगी। यदि आप स्क्रैच द्वारा अपना नेविगेशन बार बनाते हैं, तो वे गुण काम नहीं करेंगे।
एंटोनियो एमजी

मुझे नहीं लगता कि पूरे दृश्य पर एक छोटी सी काली परत क्यों आती है? कृपया सहायता कीजिए? : /
aZtraL-EnForceR

24
यह स्पष्टीकरण आईओएस 7 यूआई ट्रांज़िशन गाइड की तुलना में बहुत बेहतर है। यह सिर्फ गाइड को बदलना चाहिए, जिससे मुझे कोई मतलब नहीं था।
सैम

2
मुझे लगता है कि ExtendedLayoutIncludesOpaqueBars NO के बजाय डिफ़ॉल्ट रूप से YES होना चाहिए। रंग बदलना (पारभासी) लेआउट को प्रभावित नहीं करना चाहिए।
व्लादिमीर स्लाविक

15

सुनिश्चित नहीं हैं कि आप स्टोरीबोर्ड का उपयोग कर रहे हैं, लेकिन यदि आप हैं, तो अपने व्यू कंट्रोलर्स को स्टेटस बार के नीचे (और नीचे बार से ऊपर) शुरू करने के लिए:

IB में व्यू कंट्रोलर का चयन करें, इंस्पेक्टर इंस्पेक्टर में, 'एक्स्टेंड एड्स - अंडर टॉप बार्स' और 'एक्सटेंड एड्स - अंडर बॉट्स बार्स' को अचयनित करें।


ठीक है। तब मुझे लगता है कि नन्दा ने जो सुझाव दिया था, वही परिणाम कार्यक्रमगत रूप से प्राप्त होगा। यदि यह viewDidLoad के अंतर्गत काम नहीं करता है, तो इसे viewDidLayoutSubviews पर ले जाना पड़ सकता है।
अली बीडल

यह दर्शाता है कि विस्तारित लेआउट में अपारदर्शी बार शामिल हैं या नहीं। @property (नॉनटॉमिक, असाइन) BOOL विस्तारितLayoutIncludesOpaqueBars चर्चा डिफ़ॉल्ट मान नहीं है।
अब्दुल यासीन

+1, आपने मुझे स्टोरीबोर्ड में जांच करने का संकेत दिया। और मैंने अपनी आधी समस्या हल कर ली।
सेल्वा

10

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

import Foundation
import UIKit

// This ViewController is connected to a view on a storyboard that 
// has a scrolling sub view.
class TheViewController: UIViewController {

  // Prepares the view prior to loading.  Putting it in viewDidAppear didn't work.
  override func viewWillAppear(animated: Bool) {

    // this method is an extension of the UIViewController 
    // so using self works as you might expect.
    self.automaticallyAdjustsScrollViewInsets = false

    // Default is "true" so this sets it to false tells it to use 
    // the storyboard as you have it placed
    // and not how it thinks it should place it.
  }

}

मेरी समस्या: स्टोरीबोर्ड डिज़ाइन और सिम्युलेटर के बीच अंतर के कारण ऑटो समायोजित डिफ़ॉल्ट रूप से सत्य है डिफ़ॉल्ट रूप से ऑटो एडजस्ट सेट टू स्टोरीबोर्ड डिज़ाइन और सिम्युलेटर के बीच अंतर पैदा करता है

हल: कोड ऊपर लागू, ऑटो-समायोजन बंद। ऑटो-एडजस्टमेंट को बंद करते हुए कोड ऊपर लागू किया गया।


5
यदि आप स्वचालित रूप से AdAdsscrollViewInsets को YES के रूप में चालू करते हैं, तो आपको शीर्ष बाधा को सुपरव्यूइड सेट करना चाहिए न कि topGuideLayout।
xmkevinchen

5

मैंने इस लाइन को जोड़कर इस समस्या को हल किया, लेकिन मेरी समस्या ए से संबंधित थी UIView, नहींUIScrollView

self.navigationController.navigationBar.translucent = NO;

2

इस बात को ध्यान में रखते हुए कि automaticallyAdjustsScrollViewInsets संपत्ति तभी काम करती है जब किसी तरह का स्क्रॉल व्यू (टेबल व्यू, कलेक्शन व्यू, ...) या तो होता है

  • वीसी का नजरिया, या
  • इस दृश्य का पहला सबव्यू

अन्य ने सुझाव दिया, कि यह पहला उप-भाग होने पर भी काम करता है, लेकिन दृश्य पदानुक्रम में अन्य स्क्रॉल दृश्य हैं।

EDIT (एक्सटेंशन DIY)

यदि आप इन शर्तों को पूरा नहीं कर सकते हैं, तो भी आप ऐसा ही व्यवहार चाहते हैं (जैसे कि आपके पास स्क्रॉल दृश्य के नीचे एक पृष्ठभूमि छवि है), आप स्क्रॉल दृश्य इनसेट को मैन्युअल रूप से समायोजित कर सकते हैं। लेकिन कृपया इसे 44 या 64 की तरह स्थिर करने के लिए सेट न करें या 20 की तरह कई एसओ के आसपास सुझाव दें। आप कभी भी आकार नहीं जान सकते। इसमें incall / gps / ऑडियो नोटिफिकेशन हो सकता है, नेविगेशन बार में हमेशा 44 pts आदि नहीं होने चाहिए।

मुझे लगता है कि सबसे अच्छा समाधान layoutGuide उपयोग करने के लिए है lengthdidLayoutSubviews में:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    scrollView.contentInset = UIEdgeInsets(top: topLayoutGuide.length, left: 0, bottom: 0, right: 0)
    scrollView.scrollIndicatorInsets = scrollView.contentInset
}

आप उसी तरीके से बॉटमलाइटगाइड का उपयोग कर सकते हैं।


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