2016-02-18 8 views
11

कवर नहीं करता है मैं एक आईओएस ऐप विकसित कर रहा हूं। मेरे पास एक मुख्य दृश्य है और इस दृश्य में मैं dimmed पृष्ठभूमि (अस्पष्टता के साथ काला) के साथ एक मोडल व्यू नियंत्रक प्रस्तुत करने की कोशिश कर रहा हूँ। समस्या यह है कि स्टेटस बार इस रंग से प्रभावित नहीं होता है और यह वही रहता है।मॉडल व्यू कंट्रोलर स्टेटस बार

यह समस्या (स्थिति पट्टी रंग) है: Problem illustration यह मॉडल है

let shareViewController = self.storyboard?.instantiateViewControllerWithIdentifier("ShareViewController") as! ShareViewController 
      shareViewController.battle = battle 
      shareViewController.delegate = self 
      let animation = CATransition() 
      animation.duration = 1 
      animation.type = kCATransitionFade 
      self.view.window?.layer.addAnimation(animation, forKey: kCATransition) 
      presentViewController(shareViewController, animated: false) { 
       () in 
       // nothing here 
      } 

यहाँ कुछ स्क्रीनशॉट समस्या प्रदर्शित करने के लिए कर रहे हैं:

यह मैं कैसे दृश्य नियंत्रक पेश है स्टोरीबोर्ड में देखें: storyboard

+0

कोई मददगार लोग ?? –

+0

अगर –

उत्तर

0

यह कोड मेरे लिए काम करता है, जब मैं UIViewController अल्फा के साथ प्रस्तुत कर रहा हूं! = 1। वर्तमान UIViewController की तरह: destinationVC

let storyBoard = UIStoryboard(name: "Main", bundle: nil) 
let destinationVC = storyBoard.instantiateViewController(withIdentifier: "AddComment") as! AddCommentViewController 
destinationVC.modalPresentationStyle = .overCurrentContext //this line is important 
destinationVC.delegate = self 
destinationVC.restId = self.restaurant.id 
self.present(destinationVC, animated: true, completion: nil) 

तो में दृश्य नियंत्रक

override func viewWillDisappear(_: Bool) { 
     UIView.animate(withDuration: 1, animations: {() in 
      self.view.backgroundColor = .clear 
     }) 
     super.viewWillDisappear(true) 
    } 

override func viewWillAppear(_: Bool) { 
    UIView.animate(withDuration: 1, animations: {() in 
     self.view.backgroundColor = UIColor.black.withAlphaComponent(0.5) 
    }) 
    super.viewWillAppear(true) 
} 

और उसके backgroundColor में .clear करने के लिए viewDidLoad या स्टोरीबोर्ड निर्धारित किया है। तो UIViewController स्टेटस बार सहित पूरी स्क्रीन को शामिल करता है।

0

आप अत्यंत व्यावहारिक हो सकता है और केवल स्थिति बार छुपाने जब अपने मॉडल दृश्य नियंत्रक निर्भर है:

if let window = UIApplication.shared.keyWindow { 
    window.windowLevel = UIWindowLevelStatusBar + 1 
} 

मुख्य विचार:

override func prefersStatusBarHidden() -> Bool { 
    return true 
} 
+0

में कोई भी करता है तो कृपया ShareViewController का कोड साझा करें, मुझे लगता है कि यह * नहीं * ओपी क्या ढूंढ रहा है, यह स्थिति बार को छिपाने के बारे में नहीं है, इसे कवर करने के बारे में है। वैसे भी, यह एक कामकाज हो सकता है ... –

+0

मुझे पता चला है कि एक बिंदु आता है जहां शुद्ध और सुंदर समाधान की तलाश करना उचित नहीं है, क्योंकि ऐप्पल का एसडीके शुद्ध और सुंदर से बहुत दूर है। – ClayJ

+0

असल में, यह सिर्फ आपको अपनी सीमाओं से परे देखना है)) –

0

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

+0

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

+0

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

0

कस्टम एनीमेशन संक्रमण UIViewControllerAnimatedTransitioning का उपयोग करके किया जाना चाहिए। https://www.raywenderlich.com/110536/custom-uiviewcontroller-transitions

यदि सब आप चाहते हैं एक फीका एनीमेशन आप ViewController आप प्रदर्शित करने के लिए जा रहे हैं की modalTransitionStyle संपत्ति बदलकर हो सकता है: यहाँ इस उद्देश्य के लिए एक ट्यूटोरियल है।

कोशिश अपने कोड इस तरह से ठीक करके:

guard let shareViewController = self.storyboard?.instantiateViewControllerWithIdentifier("ShareViewController") as! ShareViewController else { 
    //Fallback in case of nil? 
    return 
} 
shareViewController.modalTransitionStyle = .crossDissolve 
presentViewController(shareViewController, animated: true, completion: nil) 

इसके अलावा, कृपया ध्यान दें कि presentViewController(shareViewController, animated: true, completion: nil) तेज 2. बराबर तेजी से 3 के लिए है हो सकता है present(shareViewController, animated: true, completion: nil)

5

मैं आपकी समस्या को पुन: पेश नहीं कर सकते, निम्नलिखित कोड काम करता है मेरे एकल दृश्य ऐप में समस्याओं के बिना:

let viewController = UIViewController() 
viewController.modalPresentationStyle = .overFullScreen 
viewController.view.backgroundColor = UIColor.black.withAlphaComponent(0.5) 

let animation = CATransition() 
animation.duration = 1 
animation.type = kCATransitionFade 
self.view.window?.layer.add(animation, forKey: kCATransition) 

self.present(viewController, animated: false, completion: nil) 

हालांकि ध्यान दें कि आपको रूट नियंत्रक पर प्रस्तुत होना चाहिए राय।कभी-कभी आप जब अपने आंतरिक नियंत्रकों से पेश अजीब प्रभाव प्राप्त कर सकते हैं:

self.view.window?.rootViewController?.present(viewController, animated: false, completion: nil) 

इसके अलावा, आप सही modalPresentationStyle उपयोग कर रहे हैं सुनिश्चित करें।

Example

0

आप के लिए नियंत्रक देखने पर स्विफ्ट 3 इस कोड को जोड़ सकते हैं:

let statusView: UIView = UIView(frame: CGRect(x: 0.0, y: -20.0, width: UIScreen.main.bounds.size.width, height: 20.0)) 
statusView.backgroundColor = UIColor.black 
statusView.alpha = 0.8 
self.addSubview(self.statusView) 
0

सेट एक UIWindow रूट दृश्य नियंत्रक के रूप में आपके विचार नियंत्रक, तो UIWindowLevelAlert पर खिड़की पेश स्तर।

नीचे स्विफ्ट 3 कक्षा स्टेटस बार समेत अन्य सभी UI तत्वों पर एक मोडल पॉपअप को एनिमेट करने के लिए उपयोग की जाती है। पृष्ठभूमि को यूआई छाया करने और दृश्य को खारिज करने के लिए स्पर्श को रोकने के लिए एक scrim व्यू का उपयोग किया जाता है।

import UIKit 

class ModalViewController: UIViewController { 

    private let scrimView: UIView = { 
     let view = UIView() 
     view.translatesAutoresizingMaskIntoConstraints = false 
     view.backgroundColor = UIColor.black 
     view.alpha = 0.0 
     return view 
    }() 

    private var myWindow: UIWindow? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     view.backgroundColor = UIColor.clear 

     // Setup scrim View 
     view.addSubview(scrimView) 
     view.topAnchor.constraint(equalTo: scrimView.topAnchor).isActive = true 
     view.leftAnchor.constraint(equalTo: scrimView.leftAnchor).isActive = true 
     view.rightAnchor.constraint(equalTo: scrimView.rightAnchor).isActive = true 
     view.bottomAnchor.constraint(equalTo: scrimView.bottomAnchor).isActive = true 

     let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismiss as (Void) -> Void)) 
     scrimView.addGestureRecognizer(tapGestureRecognizer) 

     // Layout custom popups or action sheets 
    } 

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

     UIView.animate(withDuration: 0.25) { 
      self.scrimView.alpha = 0.5 
      // Animate in custom popups or action sheets 
     } 
    } 

    func present() { 
     myWindow = UIWindow(frame: UIScreen.main.bounds) 
     myWindow?.windowLevel = UIWindowLevelAlert 
     myWindow?.backgroundColor = UIColor.clear 
     myWindow?.rootViewController = self 
     myWindow?.isHidden = false 
    } 

    func dismiss() { 

     UIView.animate(
      withDuration: 0.25, 
      animations: { 
       self.scrimView.alpha = 0.0 
       // Animate out custom popups or action sheets 
      }, 
      completion: { success in 
       self.myWindow = nil 
      } 
     ) 
    } 
} 

दृश्य पेश करने के लिए:

let modalView = ModalViewController() 
modalView.present() 

दृश्य को खारिज करने के कनवास पर कहीं भी टैप।

संबंधित मुद्दे