Her şeyden önce bir gezinme çubuğu bile UIView ekleyin


181

Diğer görünümlerin üzerinde, hatta gezinme çubuğunda, şöyle görünen bir tür "pop-up" görünüm görüntülemek istiyorum:

  • tam ekran siyah arka plan 0.5 alfa ile UIViewControlleraltında diğerini görmek için .
  • UIViewortada bazı bilgiler içeren bir pencere, (her şeyi bilmek istiyorsanız bir takvim).

Bunu yapmak için, iki UIViews(arka plan ve pencere) içeren bir UIViewController oluşturdum ve ben görüntülemeye çalışıyorum. Basit bir denedim [mySuperVC addSubview:myPopUpVC.view], ama yine de yukarıdaki gezinme çubuğum var.

Bunu bir modsal olarak sunmaya çalıştım, ancak alt UIViewControllerkısım kayboluyor ve şeffaflık efektimi kaybediyorum.

Bunu yapmak için herhangi bir fikir, eminim oldukça basit ...

Teşekkürler!


Uygulama pencerenize bir alt görünüm ekleyin. Yönlendirme değişikliklerini ele almak zor olabilir: stackoverflow.com/questions/8774495/…
Amar

Yanıtlar:


197

Görünümünüzü doğrudan keyWindow'a ekleyerek bunu yapabilirsiniz:

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

GÜNCELLEME - Swift 4.1 ve üstü için

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

2
Teşekkürler :) Ne yazık ki manzara modunda iseniz görünümü döndürmek gerekir. Bunu nasıl doğru yapacağımı bildiğimden emin değilim.
Nicolas Roy

Evet, yalnızca yatay moddayım ve myView 90 derecelik bir dönüşle görünüyor. Burada konuştukları şey gibi görünüyor: stackoverflow.com/questions/8774495/…
Nicolas Roy

Oryantasyon sorunu, bu çözümün ne yazık ki işe yaramadığı iOS8 öncesi cihazlarda ortaya çıkıyor.
thgc

@NicolasRoy Autolayout yardımcı olacak
Darmen Amanbayev

4
sekme çubuğunu kapsamaz. Bunun için bir çözüm var mı?
Manisha

134

[self.navigationController.view addSubview:overlayView]; gerçekten istediğin bu


5
Çerçeveyi ayarlamanız gerekiyor
Gabriel Goncalves

1
Özellikle, "çocuk görüntüleme denetleyicisi" olarak bir görünüm eklediğinizde çok iyi bir çözüm
Richard Topchii

2
Bu, bir alt görünüm denetleyicisinin görünümü ile çalışmaz. Gezinme çubuğunun z düzeyini değiştirmek (Nam'ın önerdiği gibi) çocuk görünümü denetleyicileriyle de çalışır.
Tapani

Anahtar penceresine görünüm eklemekten daha zarif bir çözüm gibi görünüyor. Bu, ek görünüm sağladığından, temel görünüm animasyonu boyunca hareket eder. Çünkü görünüm anahtar pencereye eklenirse, animasyonla birlikte gelmez ve denetleyiciyi kapatmak istiyorsanız ayrı olarak kaldırılması gerekir.
soan saini

pop-up üzerinden değil ama benim durumum için doğru şey. Teşekkürler))
Dilshod Zopirov

112

İşte benim için çalışan basit ve zarif bir çözüm. Gezinme çubuğunun z konumunu görünümün altına ayarlayabilirsiniz:

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

Bittiğinde tekrar 0'a ayarlamayı unutmayın.


1
Bu, bindirme görünümünü gezinti denetleyicisinin görünümüne bir alt görünüm olarak eklemekten çok daha iyi çalışır (bu arada bir çökmeye neden olur). Bu z-pozisyon çözümü muhtemelen çok daha güvenilirdir ve gelecekte daha az soruna neden olur.
Tapani

Film şeritleriyle çalışırken harika çalışıyor. Görünümü film şeridinin içine ekleyebilirsiniz!
Jos Koomen

Benim için de harika çalışıyor. ZPosition'ın 0 değerine geri ayarlanması gerektiğini belirtmek harika olurdu (sadece bittiğinde geri ayarlanması gerektiğini belirtin). Ve tabBar (benim ekranda TabBarController gelen de. ZPosition ayarlamaya çalıştım ama 0 değerine dönerken tabBar hala görünmüyordu. Bu yüzden tabBar için isHidden özelliğini kullanmak daha iyidir.
Libor Zapletal

1
Erişilebilirlikle çalışma. Görünümü kaydırmak odaklanmayacaktır.
antonjn

Seni seviyorum!! <3
chr0x

58

Kontrol edilen yanıt için hızlı sürümler:

Hızlı 4:

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

Hızlı 3.1:

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

6
Bu kapağı tüm geçerli görünümü (görünüm denetleyicisi) yapabilir, ancak yeni görünen görünüm denetleyicisinin üzerinde görüntülenmesini sağlayabilir miyim?
Michał Ziobro

24

Görünümü NavigationController alt görünümü olarak ekleyin.

[self.navigationController.navigationBar addSubview: overlayView)]

Ayrıca pencerenin üzerine de ekleyebilirsiniz:

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

Bu yardımcı olur umarım.. :)


Üst görünüm geliyor, ancak bir düğme eklendiğinde düğme eylemi alınamadı veya overView üzerinde özel etiket metni ayarlanamadı
Vineesh TP

Benim için iyi çalışıyor:let navigationBar = viewController.navigationController!.navigationBar navigationBar.addSubview(coverView)
Arthur Clemens

22

Dalef hızlı bir çözüm:

self.navigationController?.view.addSubview(view)

11

@ Nam'ın yanıtı, yalnızca özel görünümünüzü görüntülemek istiyorsanız harika çalışır, ancak özel görünümünüzün kullanıcı etkileşimi gerektiriyorsa, için etkileşimi devre dışı bırakmanız gerekirnavigationBar .

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

Nam'ın cevabında belirtildiği gibi bu değişiklikleri geri almayı unutmayın:

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


Bunu bir uzantıyla daha iyi bir şekilde yapabilirsiniz:

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

Ve sadece şu şekilde kullanın:

self.navigationController.navigationBar.toggle()

1
mükemmel çözüm.. !! Çok şey denedim ve çok zaman geçirdim .. ama bu iyi çalışıyor .. !!
dishant

8

@Nicolas Bonnet'in cevabının hızlı versiyonu:

    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
}

Pencerenin güçlü bir özellik olması gerektiğini unutmayın, çünkü orijinal cevap pencerenin derhal yer değiştirmesine yol açar


6

Yeni bir UIWindow oluşturmanızı öneririm:

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];

Ardından görünümünüzü başka bir UIViewController'da yönetebilirsiniz. Pencereleri çıkarmak için:

[window removeFromSuperview];
window = nil;

yardımcı olacağını umuyoruz!


3
Teşekkürler, ama sanırım bir şey eksik çünkü hiçbir şey görünmüyor: /
Nicolas Roy

6

Bunu yapmanın birden fazla yolu var:

1- Eklemek yerine UIViewaçık ekleyin . Bu şekilde her şeyin üstünde olacak.UIWindowUIViewController

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

2- UIViewController cihazınızı 0,5 alfa ile arkada gösterecek özel geçiş kullanın

Bunun için şuna bakmanızı tavsiye ederim: https://github.com/Citrrus/BlurryModalSegue


4
[[UIApplication sharedApplication].windows.lastObject addSubview:myView];

3

Swift 4.2 ve Xcode 10'da

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!)

In Objective C

UIView * spinnerView; // Bu sizin görüşünüz

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];

Bu yalnızca Dikey VEYA Yatay modda çalışabilir.

Bir basit kod daha:

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

2

Tam ekrana görünüm eklemek istiyorsanız, yalnızca aşağıdaki kodu kullanın

Bu ekleme uzantısı arasında 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
      }
   }
}

Alt görünüm normal ekleme işlemi olarak devam et

Şimdi UIViewController'ın viewDidAppear'ını eklerken kullanın

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

     self.makeViewAsFullScreen()
}

1

Ben başkalarının görünüm denetleyicileri gömer bir "Kapsayıcı Görünümü" içeren bir UIViewController alt sınıfı kullanırdım. Daha sonra gezinti denetleyicisini Kapsayıcı Görünümü'ne ekleyebilirsiniz (örneğin, yerleştirme ilişki sekmesini kullanarak).

Bkz. Kapsayıcı Görünümü Denetleyicisini Uygulama


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

Bu yöntem xcode 9.4, iOS 11.4 ile çalışır


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];

resim açıklamasını buraya girin


0

UITextEffectsWindow türüyle ilk pencereye bir alt görünüm eklemeniz gerekir. Birincisine, özel klavyeler UITextEffectsWindow'larını eklediğinden ve bir alt görünüm eklerseniz bu düzgün çalışmaz. Ayrıca, son pencereye bir alt görünüm ekleyemezsiniz, örneğin klavye de bir penceredir ve klavye penceresinden sunamazsınız. Bu yüzden bulduğum en iyi çözüm, UITextEffectsWindow tipi ile ilk pencereye alt görünüm (hatta görünüm denetleyicisi) eklemek, bu pencere aksesuar görünümünü, navbar'ı - her şeyi kapsıyor.

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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.