ऊपर एक UIVIV जोड़ें, यहां तक ​​कि नेविगेशन बार भी


181

मैं किसी भी अन्य दृश्य के ऊपर प्रदर्शित करना चाहता हूं, यहां तक ​​कि नेविगेशन बार, एक तरह का "पॉप-अप" दृश्य जो इस तरह दिखता है:

  • अन्य UIViewControllerनीचे देखने के लिए 0.5 अल्फा के साथ पूर्ण स्क्रीन काली पृष्ठभूमि ।
  • UIViewकुछ जानकारी के साथ बीच में एक खिड़की, (एक कैलेंडर यदि आप सब कुछ जानना चाहते हैं)।

ऐसा करने के लिए, मैंने एक UIViewController बनाया है जिसमें दो UIViews(पृष्ठभूमि और विंडो) शामिल हैं, और मैं इसे प्रदर्शित करने की कोशिश कर रहा हूं। मैंने एक सरल कोशिश की है [mySuperVC addSubview:myPopUpVC.view], लेकिन मेरे पास अभी भी ऊपर नेविगेशन बार है।

मैंने इसे एक आदर्श के रूप में प्रस्तुत करने की कोशिश की है, लेकिन UIViewControllerनीचे गायब हो जाता है, और मैं अपना पारदर्शिता प्रभाव खो देता हूं।

ऐसा करने के लिए कोई भी विचार, मुझे यकीन है कि यह काफी सरल है ...

धन्यवाद!


अपनी एप्लिकेशन विंडो पर एक सबव्यू जोड़ें। अभिविन्यास परिवर्तन से निपटने मुश्किल हो सकता है: stackoverflow.com/questions/8774495/…
अमर

जवाबों:


197

आप अपने विचार को सीधे keyWindow में जोड़कर कर सकते हैं:

UIView *myView = /* <- Your custom view */;
UIWindow *currentWindow = [UIApplication sharedApplication].keyWindow;
[currentWindow addSubview:myView];

अद्यतन - स्विफ्ट 4.1 और इसके बाद के संस्करण के लिए

let currentWindow: UIWindow? = UIApplication.shared.keyWindow
currentWindow?.addSubview(myView)

2
धन्यवाद :) दुर्भाग्य से अगर आप लैंडस्केप मोड में हैं तो आपको व्यू को घुमाना होगा। मुझे यकीन नहीं है कि मुझे पता है कि मुझे ठीक से कैसे करना है।
निकोलस रॉय

हां, मैं केवल लैंडस्केप मोड में हूं और myView 90 डिग्री रोटेशन के साथ दिखाई देता है। लगता है कि वे यहाँ क्या बात कर रहे हैं: stackoverflow.com/questions/8774495/…
निकोलस रॉय

पूर्व-iOS8 उपकरणों पर अभिविन्यास समस्या होती है, जिसके लिए यह समाधान दुख की बात नहीं है।
thgc


4
यह टैब बार कवर नहीं करता है। उसके लिए कोई उपाय?
मनीषा

134

[self.navigationController.view addSubview:overlayView]; वास्तव में आप क्या चाहते हैं


5
आपको फ्रेम सेट करने की आवश्यकता है
गेब्रियल गोंक्लेव्स

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

2
यह चाइल्ड व्यू कंट्रोलर के दृष्टिकोण से काम नहीं करता है। नेविगेशन बार के z- लेवल को बदलना (जैसा कि नाम से पता चलता है) चाइल्ड व्यू कंट्रोलर्स के साथ भी काम करता है।
तपन

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

यह पॉपअप नहीं है, लेकिन मेरे मामले के लिए यह सही बात है। धन्यवाद))
दिलशोप ज़ोप्रोव

112

यहाँ एक सरल सुरुचिपूर्ण समाधान है जो मेरे लिए काम कर रहा है। आप दृश्य के नीचे नेविगेशन बार की z स्थिति सेट कर सकते हैं:

self.navigationController.navigationBar.layer.zPosition = -1;

बस जब इसे 0 पर सेट करना याद रखें।


1
यह ओवरले दृश्य को नेविगेशन नियंत्रक के दृश्य के उप-भाग के रूप में जोड़ने से बहुत बेहतर काम करता है (जो वैसे भी दुर्घटना का कारण बनता है)। यह z- स्थिति समाधान संभवतः अधिक विश्वसनीय है और भविष्य में कम समस्याओं का कारण बनता है।
तपन

स्टोरीबोर्ड के साथ काम करने पर यह बहुत अच्छा काम करता है। आप स्टोरीबोर्ड के अंदर दृश्य जोड़ सकते हैं!
जोस कोमेन

मेरे लिए भी बहुत अच्छा काम करता है। यह उल्लेख करना बहुत अच्छा होगा कि zPosition को 0 मान पर वापस सेट किया जाना चाहिए (आप बस उल्लेख करते हैं कि इसे वापस किया जाना चाहिए जब किया जाता है)। और मेरे पास tabBar है (TabBarController से मेरी स्क्रीन में भी। मैंने zPosition सेट करने की कोशिश की, लेकिन 0 मान पर लौटते समय tabBar अभी भी दिखाई नहीं दे रहा था। इसलिए tabBar के लिए isHidden प्रॉपर्टी का उपयोग करना बेहतर है।
Libar Zapletal

1
पहुंच के साथ काम न करें। दृश्य पर ध्यान केंद्रित यह ध्यान केंद्रित नहीं करेगा।
एंटोनजेन

मैं तुमसे प्यार करता हूँ!! <3
chr0x

57

जाँच की गई प्रतिक्रिया के लिए स्विफ्ट संस्करण:

स्विफ्ट 4:

let view = UIView()
view.frame = UIApplication.shared.keyWindow!.frame
UIApplication.shared.keyWindow!.addSubview(view)

स्विफ्ट 3.1:

let view = UIView()
view.frame = UIApplication.sharedApplication().keyWindow!.frame 
UIApplication.sharedApplication().keyWindow!.addSubview(view)

6
क्या मैं इस कवर को सभी वर्तमान दृश्य (व्यू कंट्रोलर) बना सकता हूं, लेकिन इसके ऊपर प्रदर्शित होने वाले नए दिखने वाले व्यू कंट्रोलर को छोड़ दें?
मिचेल जाइब्रो

24

आप नेविगेशनकंट्रोलर के उपक्षेत्र के रूप में देखें।

[self.navigationController.navigationBar addSubview: overlayView)]

आप इसे खिड़की पर भी जोड़ सकते हैं:

UIView *view = /* Your custom view */;
UIWindow *window = [UIApplication sharedApplication].keyWindow;
[window addSubview:view];

उम्मीद है की यह मदद करेगा.. :)


ओवर व्यू आ रहा है लेकिन, जब एक बटन जोड़ने पर बटन एक्शन नहीं हो सकता है या ओवरव्यू पर कस्टम लेबल टेक्स्ट सेट कर सकते हैं
विनेश टीपी

मेरे लिए ठीक काम करता है:let navigationBar = viewController.navigationController!.navigationBar navigationBar.addSubview(coverView)
आर्थर क्लेमेंस

22

स्विफ्ट में बहुत बढ़िया घोल:

self.navigationController?.view.addSubview(view)

11

@ नाम का उत्तर बहुत अच्छा काम करता है यदि आप केवल अपना कस्टम दृश्य प्रदर्शित करना चाहते हैं लेकिन यदि आपके कस्टम दृश्य को उपयोगकर्ता सहभागिता की आवश्यकता है तो आपको इंटरेक्शन को अक्षम करना होगाnavigationBar

self.navigationController.navigationBar.layer.zPosition = -1
self.navigationController.navigationBar.isUserInteractionEnabled = false

जैसा कि नेम के जवाब में कहा गया है कि इन बदलावों को उलटना न भूलें:

self.navigationController.navigationBar.layer.zPosition = 0
self.navigationController.navigationBar.isUserInteractionEnabled = true


आप इसे एक्सटेंशन के साथ बेहतर तरीके से कर सकते हैं:

extension UINavigationBar {
    func toggle() {
        if self.layer.zPosition == -1 {
            self.layer.zPosition = 0
            self.isUserInteractionEnabled = true
        } else {
            self.layer.zPosition = -1
            self.isUserInteractionEnabled = false
        }
    }
}

और बस इसे इस तरह से उपयोग करें:

self.navigationController.navigationBar.toggle()

1
सही समाधान .. !! बहुत सी चीजों की कोशिश की और इतना समय बिताया .. लेकिन यह ठीक काम करता है .. !!
दिशांत

8

@Nicolas Bonnet के उत्तर का स्विफ्ट संस्करण:

    var popupWindow: UIWindow?

func showViewController(controller: UIViewController) {
    self.popupWindow = UIWindow(frame: UIScreen.mainScreen().bounds)
    controller.view.frame = self.popupWindow!.bounds
    self.popupWindow!.rootViewController = controller
    self.popupWindow!.makeKeyAndVisible()
}

func viewControllerDidRemove() {
    self.popupWindow?.removeFromSuperview()
    self.popupWindow = nil
}

यह मत भूलो कि खिड़की एक मजबूत संपत्ति होनी चाहिए, क्योंकि मूल उत्तर खिड़की के तत्काल निपटान की ओर जाता है


6

मैं आपको एक नया UIWindow बनाने की सलाह देता हूं:

UIWindow *window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
window.rootViewController = viewController;
window.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
window.opaque = NO;
window.windowLevel = UIWindowLevelCFShareCircle;
window.backgroundColor = [UIColor clearColor];

[window makeKeyAndVisible];

फिर आप दूसरे UIViewController में अपने विचार का प्रबंधन कर सकते हैं। खिड़कियों को हटाने के लिए:

[window removeFromSuperview];
window = nil;

उम्मीद है कि मदद मिलेगी!


3
धन्यवाद, लेकिन मुझे लगता है कि कुछ याद आ रहा है क्योंकि कुछ भी दिखाई नहीं देता: /
निकोलस रॉय

6

इसे करने का एक से अधिक तरीका है:

1- इसे जोड़ने के बजाय अपने UIViewको जोड़ें । इस तरह यह हर चीज में शीर्ष पर होगा।UIWindowUIViewController

   [[(AppDelegate *)[UIApplication sharedApplication].delegate window] addSubview:view];

2- कस्टम ट्रांज़िशन का उपयोग करें जो आपके UIViewController को 0.5 अल्फा के साथ पीछे दिखाएगा

इसके लिए मैं आपको इसे देखने की सलाह देता हूं: https://github.com/Citrrus/BlurryModalSegue



2

नोट यदि आप पूर्ण स्क्रीन में दृश्य जोड़ना चाहते हैं तो केवल नीचे दिए गए कोड का उपयोग करें

UIViewController के इन एक्सटेंशन को जोड़ें

public extension UIViewController {
   internal func makeViewAsFullScreen() {
      var viewFrame:CGRect = self.view.frame
      if viewFrame.origin.y > 0 || viewFrame.origin.x > 0 {
        self.view.frame = UIScreen.main.bounds
      }
   }
}

सबव्यू की सामान्य जोड़ प्रक्रिया के रूप में जारी रखें

अब UIViewController के viewDidAppear को जोड़ने में उपयोग करें

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

     self.makeViewAsFullScreen()
}

2

स्विफ्ट 4.2 और एक्सकोड 10 में

var spinnerView: UIView? //This is your view

spinnerView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: UIScreen.main.bounds.size.height))
//Based on your requirement change width and height like self.view.bounds.size.width
spinnerView?.backgroundColor = UIColor.black.withAlphaComponent(0.6)
//        self.view.addSubview(spinnerView)
let currentWindow: UIWindow? = UIApplication.shared.keyWindow
currentWindow?.addSubview(spinnerView!)

में उद्देश्य सी

UIView * spinnerView; // यह आपका विचार है

self.spinnerView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, UIScreen.mainScreen.bounds.size.width, UIScreen.mainScreen.bounds.size.height)];  
//Based on your requirement change width and height like self.view.bounds.size.width
self.spinnerView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.6];
// [self.view addSubview:self.spinnerView];
UIWindow *currentWindow = [UIApplication sharedApplication].keyWindow;
[currentWindow addSubview:self.spinnerView];

यह पोर्ट्रेट या लैंडस्केप मोड में ही काम कर सकता है।

एक और सरल कोड है:

yourViewName.layer.zPosition = 1//Change you view name

1

मैं एक UIViewController उप-वर्ग का उपयोग करूँगा जिसमें एक "कंटेनर दृश्य" होगा जो आपके अन्य लोगों के नियंत्रकों को एम्बेड करता है। फिर आप कन्टेनर व्यू के अंदर नेविगेशन कंट्रोलर को जोड़ने में सक्षम होंगे (उदाहरण के लिए एम्बेड संबंध सेगमेंट का उपयोग करके)।

देखें एक कंटेनर देखें नियंत्रक को लागू करने


1
UIApplication.shared.keyWindow?.insertSubview(yourView, at: 1)

यह विधि xcode 9.4, iOS 11.4 के साथ काम करती है


0
[self.navigationController.navigationBar.layer setZPosition:-0.1];
UIView *view = [[UIView alloc]initWithFrame:CGRectMake(10, 20, 35, 35)];
[view setBackgroundColor:[UIColor redColor]];
[self.navigationController.view addSubview:view];
[self.navigationController.view bringSubviewToFront:view];
self.navigationController.view.clipsToBounds = NO;
[self.navigationController.navigationBar.layer setZPosition:0.0];

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


0

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

let myView = MyView()
myView.frame = UIScreen.main.bounds

guard let textEffectsWindow = NSClassFromString("UITextEffectsWindow") else { return }
let window = UIApplication.shared.windows.first { window in
    window.isKind(of: textEffectsWindow)
}
window?.rootViewController?.view.addSubview(myView)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.