iOS 7: UITableView स्टेटस बार के तहत दिखाता है


219

मेरे एप्लिकेशन की पहली स्क्रीन UITableViewControllerएक नेविगेशन बार के बिना है, जिसका अर्थ है कि सामग्री स्टेटस बार के तहत बहती है इसलिए बहुत अधिक पाठ टकराव होता है। मैंने दोनों गुणों को समायोजित कर लिया है Under top barsऔर Adjust scroll view insetsजो वास्तव में इसे स्क्रॉल करने से रोकते हैं, लेकिन तालिका दृश्य के शीर्ष पर रखने की कीमत पर। मैंने UITableView20 पिक्सेल तक फ़्रेम को सेट करने का प्रयास किया है , लेकिन यह प्रभावी नहीं होता है और जैसा कि वर्तमान में मुझे आईओएस 6 के साथ संगत होने के लिए ऐप की आवश्यकता है मैं उपयोग करने के लिए ऑटोलेयूट को मजबूर करने के लिए आईओएस 7 स्टोरीबोर्ड पर कूद नहीं सकता। शीर्ष ऊंचाई गाइड। क्या किसी ने एक समाधान पाया है जो दोनों संस्करणों के लिए काम करता है?

चीजें जो मैंने कोशिश की हैं: सेटिंग edgesForExtendedLayout, स्टोरीबोर्ड में सेटिंग्स बदलना Under top barsऔर Adjust scroll view, एक नए क्षेत्र में फ्रेम को मजबूर करना।

एक तस्वीर एक हजार शब्दों के बराबर होती है: के तहत स्थिति पट्टी प्रवाह


2
आईओएस 7. पर चलने पर टेबल पर एक खाली 20-पिक्सेल हेडर जोड़ने के लिए एक त्वरित कार्य हो सकता है
एरिकस

@ एरिक: मेरे पास पहले से ही एक UITableViewहेडर है, यह स्टेटस बार के तहत भी बहता है।
निकोलस स्मिथ

IOS 6 पर ऑटो लेआउट गाइड का उपयोग क्यों नहीं करते हैं? यह काम करता हैं।
स्टीवन फिशर

जवाबों:


366

इसे दोहराने में रुचि रखने वाले किसी भी व्यक्ति के लिए, इन चरणों का पालन करें:

  1. एक नया iOS प्रोजेक्ट बनाएं
  2. मुख्य स्टोरीबोर्ड खोलें और डिफ़ॉल्ट / प्रारंभिक हटाएं UIViewController
  3. UITableViewControllerऑब्जेक्ट लाइब्रेरी से एक नया खींचें
  4. इसे प्रारंभिक दृश्य नियंत्रक के रूप में सेट करें
  5. टेबल को कुछ परीक्षण डेटा खिलाएं

यदि आप उपरोक्त चरणों का पालन करते हैं, तो जब आप ऐप चलाते हैं, तो आप देखेंगे कि कुछ भी नहीं, जिसमें Xcode के चेकबॉक्स को "एडजेंड एग्स अंडर {टॉप, बॉटम, ओपेक} बार्स" को ट्विस्ट करना पहली पंक्ति को स्टेटस बार के तहत प्रदर्शित होने से रोकने का काम करता है, न ही आप इस प्रोग्राम को संबोधित कर सकते हैं।

उदाहरण के लिए उपरोक्त परिदृश्य में, निम्नलिखित का कोई प्रभाव नहीं पड़ेगा:

// These do not work
self.edgesForExtendedLayout=UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars=NO;
self.automaticallyAdjustsScrollViewInsets=NO;

यह मुद्दा बहुत निराशाजनक हो सकता है, और मेरा मानना ​​है कि यह Apple के अंत पर एक बग है, खासकर क्योंकि यह UITableViewControllerऑब्जेक्ट लाइब्रेरी से अपने पूर्व-वायर्ड में दिखाता है ।

मैं उन सभी से असहमत हूं, जो "मैजिक नंबर" के किसी भी रूप का उपयोग करके इसे हल करने की कोशिश कर रहे हैं, जैसे "20px का डेल्टा का उपयोग करें"। इस तरह की तंग युग्मित प्रोग्रामिंग निश्चित रूप से नहीं है जो Apple हमें यहाँ करना चाहता है।

मैंने इस समस्या के दो समाधान खोजे हैं:

  • UITableViewController'के दृश्य को संरक्षित करना :
    यदि आप UITableViewControllerस्टोरीबोर्ड में रखना चाहते हैं , तो मैन्युअल रूप से इसे किसी अन्य दृश्य में रखे बिना, आप इसे UITableViewControllerएक में एम्बेड कर सकते हैं UINavigationController(संपादक> एंबेड इन> नेविगेशन नियंत्रक) और निरीक्षक में "नेविगेशन बार दिखाता है" को अनचेक करें। । यह समस्या को बिना किसी अतिरिक्त ट्विकिंग के हल करता है, और यह UITableViewControllerस्टोरीबोर्ड में आपके दृश्य को भी संरक्षित करता है।

  • AutoLayout का उपयोग करना और UITableViewएक अन्य दृश्य में एम्बेड करना (मेरा मानना ​​है कि यह कैसे Apple हमें ऐसा करना चाहता है) :
    एक खाली बनाएं UIViewControllerऔर UITableViewइसमें अपना खींचें । फिर, अपने UITableViewस्टेटस बार की ओर से Ctrl-drag करें । जैसे ही माउस स्टेटस बार के निचले हिस्से में जाता है, आपको एक ऑटोलैयूट बुलबुला दिखाई देगा, जो कहता है कि "टॉप लेआउट गाइड"। माउस को छोड़ें और "वर्टिकल स्पेसिंग" चुनें। यह स्टेटस बार के ठीक नीचे रखने के लिए लेआउट सिस्टम को बताएगा।

मैंने एक खाली आवेदन पर दोनों तरीकों का परीक्षण किया है और वे दोनों काम करते हैं। आपको उन्हें अपनी परियोजना के लिए काम करने के लिए कुछ अतिरिक्त ट्विकिंग करने की आवश्यकता हो सकती है।


5
FYI करें, विकल्प 1 (एक एनएवी नियंत्रक में एम्बेड करना) परिणाम कोशिकाओं में पारदर्शी स्थिति पट्टी के पीछे दिखाई देता है जब आप तालिका के माध्यम से स्क्रॉल करते हैं।
रयान

4
@RRR मैंने उस पर भी ध्यान दिया, लेकिन मुझे लगता है कि यह कुछ बिंदु पर ठीक है। Apple ने मोबाइल सफारी के खुले टैब दृश्य में एक ही काम किया, टैब को स्टेटस बार के नीचे प्रदर्शित किया जाएगा। नेविगेशन कंट्रोलर समाधान सबसे सरल वर्कअराउंड है, मैं इसके लिए रूट करता हूं। हालांकि, पारभासी स्थिति पट्टी एक मूर्ख विचार है।
प्राइड चुंग

6
जब मैं टेबलव्यू से कंट्रोल-ड्रैग करता हूं, तो मैं कभी स्टेटस बार में नहीं दौड़ता। देखने में कोई भी स्टेटस बार नहीं है, यह निश्चित नहीं है कि आपका यहाँ क्या मतलब है ...
जेसी

4
विकल्प 2 अब Xcode 5 में काम नहीं करता है। वर्णित कार्य (ctrl-drag) को कभी भी काम नहीं करना चाहिए, क्योंकि यह आउटलेट सिस्टम के स्वामित्व में है, लेकिन भले ही आप मैन्युअल रूप से बाईं ओर दृश्य ट्री पर खींचें, शीर्ष लेआउट गाइड काम नहीं करता है। (यह करना चाहिए, AFAICT - मेरा मानना ​​है कि यह अभी तक AutoLayout में एक और प्रमुख बग है :( :()
एडम

3
@PrideChung टेबलव्यू के साथ हेडर का उपयोग करते समय यह बेवकूफ दिखता है, हेडर शीर्ष पर स्थिर रहता है और तत्व पीछे गायब हो जाते हैं - और पारदर्शी स्थिति बार के पीछे पीछे हट जाते हैं ...
Ixx

86

यदि आप प्रोग्राम को व्यवस्थित रूप से कर रहे हैं और UITableViewControllerबिना किसी UINavigationControllerसर्वोत्तम शर्त का उपयोग कर रहे हैं, तो निम्न कार्य करें viewDidLoad:

स्विफ्ट 3

self.tableView.contentInset = UIEdgeInsets(top: 20, left: 0, bottom: 0, right: 0)

इससे पहले स्विफ्ट

self.tableView.contentInset = UIEdgeInsetsMake(20.0f, 0.0f, 0.0f, 0.0f);

UITableViewControllerअभी भी स्थिति पट्टी के पीछे स्क्रॉल करेगा लेकिन यह नीचे नहीं होगा जब शीर्ष करने के लिए स्क्रॉल।


1
आप OS संस्करण> 7 के लिए एक चेक जोड़ सकते हैं और पुराने OSes का भी समर्थन कर सकते हैं (उन के लिए कोई इनसेट नहीं)। अन्यथा यह मेरे उद्देश्यों के लिए अच्छा काम करता था।
SimpsOff

8
हार्डकोडिंग ऊंचाई मूल्य सबसे अच्छा विचार नहीं है।
मैकीज कोजिएल

3
हां, topLayoutGuideइसके बजाय लंबाई का उपयोग करें ।
लिपका

10
मैं UIApplication.sharedApplication.statusBarFrame.size.height20 के बजाय उपयोग करता हूँ ।
mojuba

यह इन दिनों UIApplication.saring.statusBarFrame.size.height को अपडेट किया गया है।
asetniop

23

कृपया ध्यान दें: यह निम्नलिखित विन्यास के लिए मेरे लिए काम किया:

  • स्क्रीन के शीर्ष पर कोई नेविगेशन बार (तालिका दृश्य स्थिति बार से मिलता है)
  • तालिका दृश्य गैर-स्क्रॉल करने योग्य है

यदि उपरोक्त दो आवश्यकताएं पूरी नहीं हुई हैं, तो आपकी स्थिति भिन्न हो सकती है।

मूल पोस्ट

मैंने अपना विचार कार्यक्रमबद्ध रूप से बनाया और यह मेरे लिए काम कर रहा है:

- (void) viewDidLayoutSubviews {
    // only works for iOS 7+
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;

        // snaps the view under the status bar (iOS 6 style)
        viewBounds.origin.y = topBarOffset * -1;

        // shrink the bounds of your view to compensate for the offset
        viewBounds.size.height = viewBounds.size.height + (topBarOffset * -1);
        self.view.bounds = viewBounds;
    }
}

स्रोत ( पृष्ठ के निचले भाग में topLayoutGuide अनुभाग)।


दिलचस्प ... मैं इसे किसी भी समस्या के बिना अपने प्रोजेक्ट में ऐसा करने में सक्षम था ... मेरे पास हालांकि आपके द्वारा किए गए एक सरल दृश्य लेआउट संरचना हो सकती है। आपका सुझाव सही है, मैं अपने उत्तर में वह परिवर्तन करूँगा।
स्टनर

जब मैंने अपने ऐप को घुमाया तो मैं इस मुद्दे पर लड़खड़ा गया। यदि आपने रोटेशन को अक्षम कर दिया था, तो संभवतः आपके पास कोई समस्या नहीं होगी।
जेरेमी

मेरे पास अपने प्रोजेक्ट में रोटेशन सक्षम नहीं है और मैं समस्या में आया, लेकिन हाँ, अभी भी एक अच्छी बात है।
स्टनरनर

1
किसी के लिए अपने स्वयं के कंटेनर नियंत्रक को लागू करने के लिए, यह स्थिति या नेविगेशन बार को रेखांकित करने के लिए समायोजित करने का सही तरीका है!
राफेल नोब्रे

यदि आप मूल को बदलते हैं, लेकिन दृश्य सीमा की ऊँचाई नहीं, तो नीचे स्क्रीन के निचले किनारे से राशि नहीं निकाली जाएगी, जिस राशि से आपने मूल को बदला है? (इसलिए पिक्सल की आखिरी कुछ पंक्तियों को देखना असंभव हो जाता है)
Tenfour04

20

शीर्ष उत्तर में जोड़ना:

दूसरी विधि शुरू में काम नहीं करने के बाद मैंने कुछ अतिरिक्त छेड़छाड़ की और इसका हल ढूंढ लिया।

TLDR; शीर्ष उत्तर का दूसरा समाधान लगभग काम करता है, लेकिन xCode ctrl + के कुछ संस्करणों के लिए "टॉप लेआउट गाइड" और वर्टिकल स्पेसिंग का चयन करने से कुछ नहीं होता है। हालाँकि, पहले टेबल व्यू के आकार को समायोजित करके और फिर "टॉप स्पेस टू टॉप लेआउट गाइड" काम करता है


  1. स्टोरीबोर्ड पर एक रिक्त ViewController खींचें। नियंत्रक देखें

  2. दृश्य में एक UITableView ऑब्जेक्ट खींचें । (UITableViewController नहीं)। ब्लू लेआउट गाइड का उपयोग करके इसे बहुत केंद्र में रखें।

टेबल व्यू केंद्र छवि

  1. तालिका दृश्य में एक UITableViewCell खींचें। यह आपका प्रोटोटाइप पुन: उपयोग करने वाला सेल होगा, इसलिए यह विशेषता टैब के तहत पुन: उपयोग पहचानकर्ता को सेट करने के लिए मत भूलना या आपको कोई क्रैश मिलेगा।

तालिका दृश्य सेल जोड़ें पुन: पहचानकर्ता

  1. UIViewController के अपने कस्टम उपवर्ग बनाएँ, और <UITableViewDataSource, UITableViewDelegate>प्रोटोकॉल जोड़ें । पहचान निरीक्षक में इस वर्ग के लिए अपने स्टोरीबोर्ड के ViewController सेट करने के लिए मत भूलना।

  2. अपनी कार्यान्वयन फ़ाइल में अपने TableView के लिए एक आउटलेट बनाएं, और इसे "tableView" नाम दें

आउटलेट बनाएं tableView

  1. TableView पर राइट क्लिक करें और डेटा स्रोत और प्रतिनिधि दोनों को अपने ViewController पर खींचें।

डेटा स्रोत प्रतिनिधि

अब स्टेटस बार में क्लिपिंग नहीं करने के लिए।

  1. अपनी तालिका दृश्य के ऊपरी किनारे को पकड़ो और इसे नीचे धराशायी नीले ऑटो-लेआउट गाइडों में से एक में ले जाएं जो शीर्ष के पास हैं

आकार

  1. अब, आप तालिका दृश्य से शीर्ष तक ड्रैग को नियंत्रित कर सकते हैं और शीर्ष स्थान से टॉप लेआउट गाइड का चयन कर सकते हैं

टॉप स्पेस टू टॉप लेआउट गाइड

  1. यह आपको TableView के अस्पष्ट लेआउट के बारे में एक त्रुटि देगा, बस मिसिंग बाधाओं और अपने किए गए को जोड़ें।

मिसिंग अड़चनें जोड़ें

अब आप अपने टेबल व्यू को सामान्य की तरह सेट कर सकते हैं, और यह स्टेटस बार को क्लिप नहीं करेगा!


11
- (void) viewDidLayoutSubviews {
    if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
        self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque;
        if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
            self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;
        viewBounds.origin.y = topBarOffset * -1;
        self.view.bounds = viewBounds;
        self.navigationController.navigationBar.translucent = NO;
    }
}

https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/SupportingEarlieriOS.html#//apple_ref/doc/uid/TP40013174-CH14-SW1


2
स्विच <=>> और खाली निकालें अगर ब्लॉक
pfrank

1
पढ़ने self.topLayoutGuide.lengthसे viewDidLayoutSubviewsबच्चे के विचारों का लेआउट खराब हो जाएगा।

@OLzh ऐसा करते समय जैसा कि आप बताते हैं, self.tableView स्क्रॉल नहीं कर सकता है।
डॉनसॉन्ग

8

अपने स्टोरीबोर्ड पर UIViewController का चयन करें एक अनचेक विकल्प शीर्ष बार्स के तहत किनारों को बढ़ाएं। मेरे लिए काम किया। :)


काश, मेरे लिए काम नहीं किया। पूरी तरह से डिफ़ॉल्ट UITableViewController अभी भी स्थिति बार को ओवरलैप करता है। मुझे नहीं लगता कि स्टेटस बार एक टॉप बार के रूप में मायने रखता है। सिर्फ नाव बार और टैब बार।
एंड्रयू डंकन

एकमात्र समाधान जो मेरे लिए काम करता है, ty। (ध्यान दें कि आपको आईबी और अपडेट बाधाओं में स्टेटस बार के तहत "छोटा" करना होगा)।
मार्टिन मकरस्की

एक UITableViewController के साथ Xcode 8 पर मेरे लिए काम किया।
एडवर्ड बारबियर

8

यह है कि इसे "स्विफ्ट" में कैसे लिखा जाए @ लिपका के जवाब के लिए एक समायोजन:

tableView.contentInset = UIEdgeInsetsMake(20.0, 0.0, 0.0, 0.0)

क्या यहाँ स्विफ्ट की अनुमति नहीं है?
uplearnedu.com

एकमात्र समाधान है कि मेरे लिए काम किया, कि मुझे एक UIViewController बनाने नहीं है
Shereef Marzouk

1
यह आदर्श से कम है क्योंकि यह शीर्ष इनसेट को 20 पर रखता है, यहां तक ​​कि परिदृश्य में भी जहां ios8 में कोई डिफ़ॉल्ट स्थिति पट्टी नहीं है
voidref

यह भिन्नता मेरे लिए किसी भी विन्यास को अच्छी तरह से संभालती है:- (void)viewDidLayoutSubviews { if (self.tableView.contentInset.top != self.topLayoutGuide.length) { self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0.0, 0.0, 0.0); } }
qix

5

Xcode 7 के लिए, नेविगेशन बार के लिए 'पारभासी' चेक मार्क को अन-टिक करना मेरे लिए काम किया।

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


सबसे सरल, सबसे तेज, सबसे आसान, सबसे सुरक्षित? उपाय। पता नहीं क्यों यह सब कुछ की तुलना में बहुत कम upvotes है।
ग्रंटककेस

3

यह इसे UITableViewController (बिना किसी जादुई संख्या के) के लिए ठीक कर देगा। केवल एक चीज जिसे मैं ठीक नहीं कर पाया वह यह है कि यदि आप एक फोन कॉल पर हैं, तो किस स्थिति में तालिका के शीर्ष को बहुत नीचे धकेल दिया जाता है। अगर किसी को पता है कि कैसे हल करना है, तो कृपया हमें बताएं।

class MyTableViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()    
        configureTableViewTop()
    }

    override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
        coordinator.animateAlongsideTransition({ (context) -> Void in
            }, completion: { (context) -> Void in
                self.configureTableViewTop()
        })
    }

    func configureTableViewTop() { 
        tableView.contentInset.top = UIApplication.sharedApplication().statusBarFrame.height
    }
}

2

मुझे पता नहीं है कि कोषेर यह कैसा है, लेकिन मैंने पाया कि यह योजना व्यूकंट्रोलर के दृष्टिकोण को नीचे ले जाती है और एक ठोस पृष्ठभूमि के साथ स्थिति पट्टी प्रदान करती है:

- (void)viewDidLoad {
    [super viewDidLoad];

    // Shove everything down if iOS 7 or later
    float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (systemVersion >= 7.0f) {

        // Move the view down 20 pixels
        CGRect bounds = self.view.bounds;
        bounds.origin.y -= 20.0;
        [self.view setBounds:bounds];

        // Create a solid color background for the status bar
        CGRect statusFrame = CGRectMake(0.0, -20.0, bounds.size.width, 20);
        UIView* statusBar = [[UIView alloc] initWithFrame:statusFrame];
        statusBar.backgroundColor = [UIColor redColor];
        [self.view addSubview:statusBar];
    }

बेशक, redColorआप पृष्ठभूमि के लिए जो भी रंग चाहते हैं , उसे बदल दें ।

स्टेटस बार में अक्षरों / प्रतीकों के रंग को सेट करने के लिए आपको अलग-अलग स्विज़ल्स में से एक करना होगा। मैं का उपयोग करें View controller-based status bar appearance = NOऔर Status bar style = Opaque black styleplist में, इस विश्व स्तर पर करना है।

काम करने लगता है, और मैं इसके साथ किसी भी कीड़े या मुद्दों के बारे में सुनना चाहूंगा।


2

XIBs के साथ काम करने के दौरान chappjc का जवाब बहुत अच्छा होता है।

मुझे सबसे साफ समाधान मिला जब TableViewControllers को प्रोग्रामेटिक रूप से बनाते हुए UITableViewController के उदाहरण को दूसरे UIViewController में लपेटकर और उसके अनुसार बाधाओं को सेट करके।

यह रहा:

UIViewController *containerLeftViewController = [[UIViewController alloc] init];
UITableViewController *tableViewController = [[UITableViewController alloc] init];

containerLeftViewController.view.backgroundColor = [UIColor redColor];

hostsAndMoreTableViewController.view.translatesAutoresizingMaskIntoConstraints = NO;
[containerLeftViewController.view addSubview:tableViewController.view];

[containerLeftViewController addChildViewController:tableViewController];
[tableViewController didMoveToParentViewController:containerLeftViewController];

NSDictionary * viewsDict = @{ @"tableView": tableViewController.view ,
                              @"topGuide": containerLeftViewController.topLayoutGuide,
                              @"bottomGuide": containerLeftViewController.bottomLayoutGuide,
                              };
[containerLeftViewController.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[tableView]|"
                                                                                         options:0
                                                                                         metrics:nil
                                                                                           views:viewsDict]];
[containerLeftViewController.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[topGuide][tableView][bottomGuide]"
                                                                                         options:0
                                                                                         metrics:nil
                                                                                           views:viewsDict]];

चीयर्स, बेन


1

मुझे लगता है कि UITableViewController का उपयोग करने का दृष्टिकोण आपके द्वारा पहले किए गए कार्यों से थोड़ा अलग हो सकता है। इसने मेरे लिए काम किया है, लेकिन आप इसके प्रशंसक नहीं हो सकते। मैंने जो कुछ किया है, उसमें एक कंटेनर दृश्य के साथ एक नियंत्रक है जो मेरे UItableViewController को इंगित करता है। इस तरह से मैं स्टोरीबोर्ड में अपने लिए प्रदान किए गए TopLayoutGuide का उपयोग करने में सक्षम हूं। बस कंटेनर दृश्य में बाधा जोड़ें और आपको iOS7 और iOS6 दोनों का ध्यान रखना चाहिए।


1

मैं इच्छित पृष्ठभूमि के साथ एक अतिरिक्त दृश्य का उपयोग कर समाप्त हुआ, TableView के बाद जोड़ा गया और स्थिति बार के तहत रखा गया:

    self.CoverView = [[UIView alloc]init];

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {

    self.CoverView.frame = CGRectMake(0,0,self.view.bounds.size.width,20);
    }

    self.CoverView.backgroundColor = [UIColor whiteColor];
    self.TableView = [[UITableView alloc]initWithFrame:CGRectMake(0,
    self.CoverView.bounds.size.height,XXX, YYY)];
    [self.view addSubview:self.TableView];
    [self.view addSubview:self.CoverView];

यह बहुत सुंदर नहीं है, लेकिन यह सरल समाधान है, अगर आपको xib- कम विचार और IOS6 और IOS7 दोनों के साथ काम करने की आवश्यकता है


1

मैंने इसे रेटिना / नॉन-रेटिना डिस्प्ले के लिए किया है

BOOL isRetina = FALSE;

if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) {
    if ([[UIScreen mainScreen] scale] == 2.0) {
        isRetina = TRUE;
    } else {
        isRetina = FALSE;
    }
}

if (isRetina) {
    self.edgesForExtendedLayout=UIRectEdgeNone;
    self.extendedLayoutIncludesOpaqueBars=NO;
    self.automaticallyAdjustsScrollViewInsets=NO;
}

1

निम्नलिखित समाधान मैजिक कॉन्स्टेंट का उपयोग किए बिना कोड में पर्याप्त रूप से काम करता है, और उपयोगकर्ता के लिए आकार वर्ग को बदलते हैं, उदाहरण के लिए आईपैड पर घुमाव या साइड-बाय-साइड एप्लिकेशन के माध्यम से:

- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    [super traitCollectionDidChange:previousTraitCollection];
    // Fix up content offset to ensure the tableview isn't underlapping the status bar.
    self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0.0, 0.0, 0.0);
}

1

स्विफ्ट 3 के लिए काम करता है - व्यूडीडलड में ();

let statusBarHeight = UIApplication.shared.statusBarFrame.height

let insets = UIEdgeInsets(top: statusBarHeight, left: 0, bottom: 0, right: 0)
tableView.contentInset = insets
tableView.scrollIndicatorInsets = insets

यह कोड: 1. स्टेटस बार की ऊँचाई प्राप्त करता है 2. तालिका के शीर्ष को स्टेटस बार की ऊँचाई के बराबर एक सामग्री इनसेट देखता है। 3. स्क्रॉल इंडिकेटर को एक ही इनसेट देता है, इसलिए यह स्टेटस बार के नीचे दिखाई देता है।


1

मेरे जैसे उन लोगों के लिए जो इस कोशिश UITableViewControllerमें अपने को एम्बेड नहीं करेंगे UIViewController:

एक कस्टम UITableViewControllerउपवर्ग तालिका दृश्य के पर्यवेक्षण के लिए एक मुखौटा दृश्य जोड़ सकते हैं। ViewDidAppear पर मास्क जोड़ें, और viewWillDisappear पर मास्क हटा दें।

private var statusBarMaskView: UIView!

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    if let superview = self.tableView.superview {
        self.statusBarMaskView = UIView(frame: CGRect.zero)
        superview.insertSubview(self.statusBarMaskView, aboveSubview: self.tableView)
        self.statusBarMaskView.backgroundColor = self.tableView.backgroundColor

        // using a nice constraint layout library to set the frame
        self.statusBarMaskView.pinTop(to: superview)
        self.statusBarMaskView.pinLeft(to: superview)
        self.statusBarMaskView.pinRight(to: superview)
        self.statusBarMaskView.addHeightConstraint(with: 22.0)
        ////
    }
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    self.statusBarMaskView.removeFromSuperview()
    self.statusBarMaskView = nil
}

0

मेरे पास मेरे UITableView के शीर्ष पर एक UISearchBar था और निम्नलिखित काम किया;

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

साझा करें और आनंद लें...


0

मैंने इसे फ्रीफ़ॉर्म करने के लिए आकार निर्धारित करके काम किया

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


2
"सिम्युलेटेड मेट्रिक्स" केवल एक्सकोड में आपकी रचना को देखने के लिए लागू होता है, वास्तविकता नहीं। [देखें: stackoverflow.com/questions/16279379/…
टायलर A.

0

अब्राहमेज़ का समाधान https://developer.apple.com/library/ios/qa/qa1797/_index.html ने मेरे लिए निम्नानुसार काम किया। मेरे प्रारंभिक दृश्य के रूप में मेरे पास एक एकल यूआईटेबलव्यूकंट्रोलर था। मैंने ऑफसेट कोड की कोशिश की थी और एक नाविक में एम्बेड किया था लेकिन न तो स्टेटसबार पारदर्शिता को हल किया था।

एक Viewcontroller जोड़ें और इसे प्रारंभिक दृश्य बनाएं। यह आपको महत्वपूर्ण टॉप एंड बॉटम लेआउट गाइड्स दिखाना चाहिए।

नए कंट्रोलर में पुराने टेबलव्यू को व्यू में खींचें।

नए नियंत्रक में तालिका को वापस लाने के लिए सभी सामान करें:

UIVableController के बजाय UIViewController से इनहेरिट / सबक्लास करने के लिए अपने पुराने व्यू कंट्रोलर। H फाइल को बदलें।

UITableViewDataSource और UITableViewDelegate को viewcontroller -h में जोड़ें।

स्टोरीबोर्ड में आवश्यक कुछ भी फिर से कनेक्ट करें, जैसे कि एक सर्चबार।

बड़ी बात यह है कि बाधाओं को स्थापित करने के लिए, जैसा कि एप्पल क्यू एंड ए में है। मैंने टूलबार डालने की जहमत नहीं उठाई। निश्चित क्रम नहीं। लेकिन लेआउट गाइड पर एक लाल आइकन दिखाई दिया, शायद जब मैंने बनाया था। मैंने इसे क्लिक किया और Xcode स्थापित / बाधाओं को साफ करने दिया।

तब मैंने हर जगह क्लिक किया जब तक कि मुझे वर्टिकल स्पेस की कमी नहीं मिली और इसका शीर्ष मान -20 से 0 तक बदल गया और इसने पूरी तरह से काम किया।


0

मैं एक नेविगेशन कॉन्ट्रैक्टर और एक टेबलव्यू कंट्रौलर के साथ एक UISplitViewController का उपयोग कर रहा हूं। यहाँ कई समाधानों को आजमाने के बाद इस मास्टर दृश्य में मेरे लिए काम किया:

float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0f) {

    // Move the view down 20 pixels
    CGRect bounds = self.view.bounds;
    bounds.origin.y -= 20.0;
    [self.navigationController.view setBounds:bounds];

    // Create a solid color background for the status bar
    CGRect statusFrame = CGRectMake(0.0, -20.0, bounds.size.width, 20);
    UIView* statusBar = [[UIView alloc] initWithFrame:statusFrame];
    statusBar.backgroundColor = [UIColor whiteColor];
    [statusBar setAlpha:1.0f];
    [statusBar setOpaque:YES];
    [self.navigationController.view addSubview:statusBar];
}

यह हॉट लिक्स के समाधान के समान है लेकिन नेविगेशनकंट्रोलर के लिए सबव्यू लागू करता है।


यह एकमात्र उत्तर है जिसने मेरे लिए iOS 8 में काम किया है!
सामब

0
override func viewDidLoad() {
 // your code

 if let nc = self.navigationController {
   yourView.frame.origin.y = nc.navigationBar.frame.origin.y + nc.navigationBar.frame.height
  }
}

0

यहाँ एक स्विफ्ट 2.3 है। (Xcode 8.0) समाधान। मैंने UITableView का एक उपवर्ग बनाया है।

class MYCustomTableView: UITableView
{   
    override func drawRect(rect: CGRect) {
        super.drawRect(rect)
        contentInset    = UIEdgeInsetsZero
    }
}

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

अपने IB (TableViewController में या अपने ViewController के अंदर सिर्फ TableView) में TableView को अपडेट करना न भूलें।


0

मैं ios 11 में इस मुद्दे का सामना कर रहा था लेकिन ios 8 - 10.3.3 के लिए लेआउट सही था। अपने मामले के लिए मैंने सुपरव्यू के लिए एक वर्टिकल स्पेस कांस्ट्रेक्ट सेट किया। Superview.Top मार्जिन के बजाय। जो ios 8 - 11 के लिए काम करता है।

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


0

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

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


-1

सभी समाधान देखें: मेरी परियोजना सिर्फ xib का उपयोग करती है, इसलिए, स्टोरीबोर्ड के साथ समाधान ने मेरे लिए काम नहीं किया। self.edgesForExtendedLayout = UIRectEdgeNone; यदि नेविगेशनबार दिखाई देता है तो बस नियंत्रक के लिए काम करता है। लेकिन अगर आपका विचार सिर्फ स्टेटस बार है, तो यह काम नहीं करेगा। तो मैं दो conditons गठबंधन।

- (void) viewDidLayoutSubviews {
float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
if (systemVersion >= 7.0f) {
    CGRect bounds = self.view.bounds;
    if(self.navigationController == nil || self.navigationController.isNavigationBarHidden == YES){
        bounds.origin.y -= 20.0;
        [self.view setBounds:bounds];
    }
    else{
        self.edgesForExtendedLayout = UIRectEdgeNone;
    }
}

इस काम में मदद करें।


-2

यदि आपको भी iOS 6 का समर्थन करने की आवश्यकता है, तो आपको इसे सशर्त रूप से स्थानांतरित करना होगा। यही है, आईओएस 7 में आपको इसे केवल 20 अंक नीचे ले जाना चाहिए (या तो frameहेरफेर के माध्यम से या ऑटो-लेआउट का उपयोग करके), और आईओएस 6 में आप इसे अकेले छोड़ देते हैं। मुझे विश्वास नहीं है कि आप आईबी में ऐसा कर सकते हैं, इसलिए आपको इसे कोड में करना होगा।

संपादित करें

IOS6 / iOS7 डेल्टास का उपयोग करके आप वास्तव में आईबी में ऐसा कर सकते हैं। आईओएस 7 में अपनी स्थिति निर्धारित करें, फिर आईओएस 6 के लिए डेल्टा वाई को -20 पॉइंट पर सेट करें। देखें इस तो सवाल यह अधिक जानकारी के लिए।


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

इसके बारे में क्या काम नहीं करता है? तालिका दृश्य नीचे नहीं जाता है?
स्कॉट बेरेवेट्स

हाँ, यह उसी स्थिति में रहता है। मैंने कोशिश की है self.view.frameऔर self.tableView.frame, दोनों में viewWillAppearऔर viewDidLoad। सुरक्षित होने के लिए मैंने setContentNeedsDisplayरेडर को मजबूर करने के लिए भी सेट किया।
निकोलस स्मिथ

क्या ऑटो-लेआउट सक्षम है?
स्कॉट बेरेवेट्स

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