네비게이션 바를 포함하여 무엇보다도 UIView를 추가하십시오.


181

다른보기들, 심지어 네비게이션 바까지 다음과 같은 일종의 "팝업"보기를 표시하고 싶습니다 :

  • 전체 화면 검정색 배경과 0.5 알파를 사용하여 UIViewController아래 에 다른 화면을 표시합니다 .
  • UIView정보가있는 중간에 있는 창 (모든 것을 알고 싶다면 달력).

이를 위해 두 UIViews(배경 및 창) 가 포함 된 UIViewController를 만들었으며 표시하려고합니다. 나는 간단한 시도 [mySuperVC addSubview:myPopUpVC.view]했지만 여전히 위의 탐색 표시 줄이 있습니다.

나는 그것을 모달로 제시하려고했지만 UIViewController밑면이 사라지고 투명도 효과를 잃습니다.

이 작업을 수행하는 아이디어는 매우 간단합니다.

감사!


응용 프로그램 창에 서브 뷰를 추가하십시오. 방향 변경 처리가 까다로울 수 있습니다. stackoverflow.com/questions/8774495/…
Amar

답변:


197

keyWindow에 직접 뷰를 추가하면됩니다.

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

업데이트-Swift 4.1 이상

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

2
고마워 :) 불행히도 가로 모드 인 경우보기를 회전해야합니다. 제대로하는 방법을 모르겠습니다.
Nicolas Roy

예, 가로 모드에만 있고 myView가 90도 회전하여 나타납니다. 그들이 여기에서 말하는 것 같습니다 : stackoverflow.com/questions/8774495/…
Nicolas Roy

오리엔테이션 문제는 iOS8 이전 장치에서 발생하며이 솔루션은 슬프게도 작동하지 않습니다.
thgc

@NicolasRoy 자동 레이아웃은 도움이 될 것입니다
Darmen Amanbayev에게

4
탭 막대는 다루지 않습니다. 그에 대한 해결책이 있습니까?
Manisha

134

[self.navigationController.view addSubview:overlayView]; 당신이 정말로 원하는 것입니다


5
당신은 프레임을 설정해야합니다
Gabriel Goncalves

1
특히 "자식 뷰 컨트롤러"로 뷰를 추가 할 때 매우 유용한 솔루션
Richard Topchii

2
자식 뷰 컨트롤러의 뷰에서는 작동하지 않습니다. 탐색 표시 줄의 z 수준 변경 (Nam에서 제안한대로)은 자식보기 컨트롤러에서도 작동합니다.
Tapani

키 창에 뷰를 추가하는 것보다 훨씬 우아한 솔루션으로 보입니다. 이렇게하면 추가 된 뷰가 보장되므로 기본 뷰의 애니메이션을 따라 이동합니다. 키 창에보기가 추가되면 애니메이션이 제공되지 않으며 컨트롤러를 닫으려면 별도로 제거해야합니다.
soan saini

그것은 팝업이 아니지만 내 경우에는 옳은 일입니다. 감사합니다))
Dilshod Zopirov

112

나를 위해 일하는 간단한 우아한 솔루션이 있습니다. 탐색 표시 줄의 z 위치를보기 아래로 설정할 수 있습니다.

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

완료되면 다시 0으로 설정하십시오.


1
이는 오버레이 컨트롤러를 내비게이션 컨트롤러의 뷰에 하위 뷰로 추가하는 것보다 훨씬 효과적입니다. 이 z- 포지션 솔루션은 아마도 훨씬 더 안정적이며 향후 문제를 덜 발생시킵니다.
Tapani

스토리 보드 작업시 유용합니다. 스토리 보드 안에 뷰를 추가 할 수 있습니다!
Jos Koomen

나에게도 잘 작동합니다. zPosition을 값 0으로 다시 설정해야합니다 (완료되면 다시 설정해야 함). 그리고 tabBar가 있습니다 (내 화면의 TabBarController에서도. zPosition을 설정하려고했지만 0 값으로 돌아갈 때 tabBar가 보이지 않았으므로 tabBar의 경우 isHidden 속성을 사용하는 것이 좋습니다.
Libor Zapletal

1
접근성으로 작업하지 마십시오. 뷰를 패닝하면 초점이 맞지 않습니다.
antonjn

당신을 사랑합니다! <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
현재 뷰 (뷰 컨트롤러)를 모두 덮을 수 있지만 그 위에 새 뷰 컨트롤러를 표시 할 수 있습니까?
Michał Ziobro

24

NavigationController의 하위보기로 추가하십시오.

[self.navigationController.navigationBar addSubview: overlayView)]

창 위에 추가 할 수도 있습니다.

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

도움이 되었기를 바랍니다.. :)


오버뷰가 나오지만 버튼을 추가 할 때 버튼 동작을 얻지 못하거나 overView에서 사용자 지정 레이블 텍스트를 설정할 수 없습니다
Vineesh TP

나를 위해 잘 작동합니다 :let navigationBar = viewController.navigationController!.navigationBar navigationBar.addSubview(coverView)
Arthur Clemens

22

빠른 Dalef 훌륭한 솔루션 :

self.navigationController?.view.addSubview(view)

11

@Nam의 답변은 사용자 정의보기를 표시하고 싶지만 사용자 정의보기에 사용자 상호 작용이 필요한 경우에 대한 상호 작용을 비활성화해야합니다navigationBar .

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

Nam의 답변에서 말했듯이 이러한 변경 사항을 되 돌리는 것을 잊지 마십시오.

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
완벽한 솔루션 .. !! 너무 많은 것들을 시도하고 많은 시간을 보냈습니다 .. 그러나 이것은 잘 작동합니다 .. !!
Dishant

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
고맙지 만 아무것도 나타나지 않기 때문에 뭔가 빠진 것 같습니다 : /
Nicolas Roy

6

여러 가지 방법이 있습니다.

1-에 추가 UIView하는 UIWindow대신에 추가하십시오 UIViewController. 이런 식으로 모든 것 위에있을 것입니다.

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

2- UIViewController를 0.5 알파로 다시 표시하는 사용자 정의 전환을 사용하십시오.

이를 위해 다음을 참조 하십시오 : https://github.com/Citrrus/BlurryModalSegue


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

3

Swift 4.2 및 Xcode 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!)

목표 C

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

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()
}

1

다른 뷰 컨트롤러를 포함하는 "컨테이너 뷰"가 포함 된 UIViewController 서브 클래스를 사용합니다. 그런 다음 컨테이너보기 내에 탐색 컨트롤러를 추가 할 수 있습니다 (예 : 임베드 관계 segue 사용).

컨테이너 뷰 컨트롤러 구현을 참조하십시오.


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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.