iOS 13 전체 화면에서 모달 표시


465

iOS 13에는 모달 뷰 컨트롤러가 표시 될 때 새로운 동작이 있습니다.

이제 기본적으로 전체 화면이 아니며 아래로 슬라이드하려고하면 앱이 View Controller를 자동으로 닫습니다.

이 동작을 방지하고 이전 전체 화면 모달 vc로 돌아가려면 어떻게해야합니까?

모달 행동

감사

답변:


622

WWDC 2019 에서 Platforms of the Union에 언급 된대로 iOS 13을 사용하여 Apple은 새로운 기본 카드 프리젠 테이션을 도입했습니다. 전체 화면을 강제 실행하려면 다음과 같이 명시 적으로 지정해야합니다.

let vc = UIViewController()
vc.modalPresentationStyle = .fullScreen //or .overFullScreen for transparency
self.present(vc, animated: true, completion: nil)

81
나는 이것이 기본값으로 오래 머 무르지 않을 것이라고 말할 것입니다. fullScreenUI 변경을 중단하지 않으려면 이 옵션이 기본값이어야합니다.
Jakub Truhlář

17
나는 그것에 의존하지 않습니다. 과거에는 Apple이 현재 SDK와 연결 한 후에 만 ​​기본값이 활성화되도록 변경했습니다. 우리는 이전 버전과 링크 할 때 이전의 행동 을 기대 합니다.
DrMickeyLauer

11
iOS 13 시뮬레이터에서 실행되는 Xcode-10 내장 앱이 여전히 전체 화면으로 기본 설정되어 있음을 확인할 수 있습니다. @DrMickeyLauer가 말했듯이 Xcode 11로 빌드하면 앱이 새로운 동작을 선택합니다. isModalInPresentation스 와이프 제스처가 사라지지 않도록 차단하는 데 사용 합니다. 자세한 내용은 내 블로그 게시물을 참조하십시오. medium.com/@hacknicity/…
Geoff Hackworth 2009 년

5
.overFullScreen 대신 .fullScreen을 사용하는 것이 좋습니다. .fullScreen은 viewWillAppear 및 viewDidAppear를 발생시킵니다. .overFullScreen은 그렇게하지 않습니다
PiterPan

5
시간이 지났고 .automatic스타일이 기본 시간으로 정해졌습니다 (대부분의 뷰 컨트롤러의 경우) .pageSheet. 그러나 일부 시스템 뷰 컨트롤러는이를 다른 스타일로 매핑 할 수 있습니다.
Jakub Truhlář

186

누군가에게 유용한 정보를 추가합니다. 스토리 보드 segue가있는 경우 이전 스타일로 돌아가려면 kind 속성을 Present Modally 로 설정 하고 Presentation 속성을 Full Screen 으로 설정해야합니다 .

여기에 이미지 설명을 입력하십시오


2
Interface Builder에서 isModalInPresentation을 설정하는 방법이 있습니까?
Brad Thomas

이것에 동의하십시오. 최고 수준의 위반보기에 대한 프레젠테이션 값을 변경하십시오.
David

내가 가지고 있기 때문에 이것은 나를 위해 일한 사람입니다 performSegue. 고마워, 여보!
Blasanka

95

시작 화면 직후의 초기보기 에서이 문제가 발생했습니다. 정의 또는 논리가 정의되지 않았기 때문에 해결 방법은 다음과 같이 프레젠테이션을 자동에서 전체 화면으로 전환하는 것이 었습니다.

fix_storyboard_presentation_default_behavior


2
스토리 보드를 통해 하나씩 모든 뷰에 대해 프로그래밍 방식 으로이 작업을 수행 할 수있는 방법이 있습니까?
The1993

@ The1993 그에 대한 대안을 찾았습니까?
Shobhit Puri

1
@ShobhitPuri Omreyh의 첫 번째 솔루션을 살펴보십시오. stackoverflow.com/a/58255416/4323101
The1993

1
와우, 이것은 내 문제에 대한 답이었습니다. 팁 고마워! 다른 사람 도이 문제를 조사하는 경우 백그라운드에서 앱을 다시 연 후 이상한 동작에 대한 수정입니다. 내 응용 프로그램에서 배경에서 열면 스플래시 화면 (초기보기 컨트롤러)이 카드 프리젠 테이션 스타일로 오버레이되고 여기에서 나온 모든 segue는 정의 된 segue 스타일을 사용하는 대신 크로스 페이드됩니다. 앱을 닫으면 (홈 버튼을 두 번 탭하고 위로 스 와이프 한 다음 다시 열면) 괜찮을 것입니다. 그러나 추가로 실행하면 이상한 동작이 발생할 수 있습니다. 다시 감사합니다!
저스틴

92

여러 가지 방법이 있으며 각 프로젝트는 하나의 프로젝트에는 적합하지만 다른 프로젝트에는 적합하지 않다고 생각하므로 다른 사람이 다른 사건을 겪을 수도 있습니다.

1- 현재 재정의

있는 경우 메소드를 BaseViewController대체 할 수 있습니다 present(_ viewControllerToPresent: animated flag: completion:).

class BaseViewController: UIViewController {

  // ....

  override func present(_ viewControllerToPresent: UIViewController,
                        animated flag: Bool,
                        completion: (() -> Void)? = nil) {
    viewControllerToPresent.modalPresentationStyle = .fullScreen
    super.present(viewControllerToPresent, animated: flag, completion: completion)
  }

  // ....
}

이 방법을 사용 present하면 present메소드를 오버로딩하기 때문에 모든 호출에서 변경을 수행 할 필요가 없습니다 .

2- 확장자 :

extension UIViewController {
  func presentInFullScreen(_ viewController: UIViewController,
                           animated: Bool,
                           completion: (() -> Void)? = nil) {
    viewController.modalPresentationStyle = .fullScreen
    present(viewController, animated: animated, completion: completion)
  }
}

용법:

presentInFullScreen(viewController, animated: true)

3- 하나의 UIViewController

let viewController = UIViewController()
viewController.modalPresentationStyle = .fullScreen
present(viewController, animated: true, completion: nil)

4- 스토리 보드에서

segue를 선택하고 프레젠테이션을로 설정하십시오 FullScreen.
여기에 이미지 설명을 입력하십시오

5- 스위 즐링

extension UIViewController {

  static func swizzlePresent() {

    let orginalSelector = #selector(present(_: animated: completion:))
    let swizzledSelector = #selector(swizzledPresent)

    guard let orginalMethod = class_getInstanceMethod(self, orginalSelector), let swizzledMethod = class_getInstanceMethod(self, swizzledSelector) else{return}

    let didAddMethod = class_addMethod(self,
                                       orginalSelector,
                                       method_getImplementation(swizzledMethod),
                                       method_getTypeEncoding(swizzledMethod))

    if didAddMethod {
      class_replaceMethod(self,
                          swizzledSelector,
                          method_getImplementation(orginalMethod),
                          method_getTypeEncoding(orginalMethod))
    } else {
      method_exchangeImplementations(orginalMethod, swizzledMethod)
    }

  }

  @objc
  private func swizzledPresent(_ viewControllerToPresent: UIViewController,
                               animated flag: Bool,
                               completion: (() -> Void)? = nil) {
    if #available(iOS 13.0, *) {
      if viewControllerToPresent.modalPresentationStyle == .automatic {
        viewControllerToPresent.modalPresentationStyle = .fullScreen
      }
    }
    swizzledPresent(viewControllerToPresent, animated: flag, completion: completion)
   }
}

사용법 :
당신의에서 AppDelegate내부가 application(_ application: didFinishLaunchingWithOptions)이 줄을 추가합니다 :

UIViewController.swizzlePresent()

이 방법을 사용하면 런타임에서 현재 메소드 구현을 대체하므로 현재 호출에서 변경을 수행 할 필요가 없습니다.
스위 즐링이 무엇인지 알아야 할 경우이 링크를 확인할 수 있습니다 : https://nshipster.com/swift-objc-runtime/


내 프로젝트에는 많은 viewController가 있지만 기본 클래스는 없습니다. 코드를 최소한으로 변경하여 그 해결책을 원하십니까
guru

스위 즐링을 사용했지만 조건에 .pageSheet를 추가했습니다 .... if viewControllerToPresent.modalPresentationStyle == .pageSheet || viewControllerToPresent.modalPresentationStyle == .automatic {viewControllerToPresent.modalPresentationStyle = .fullScreen}
크래쉬

적용된 솔루션 번호 1을 추가하면 상태 표시 줄이 숨겨집니다.
Ganesh Pawar

4
Swizzling은 한동안 훌륭하게 작동 한 솔루션입니다. 그러나 FacebookLogin (오늘 현재 5.8) 및 GoogleSignin과 같은 외부 SDK를 사용할 때이 방법으로 인해 흐름이 깨지는 것을 알았습니다 .iPad에서 흰색 화면이 나타납니다. 이것은 아마도 그들 자신의 스위 즐링 방법을 사용하기 때문일 것입니다.
Tao-Nhan Nguyen

39

iOS 13을 위해 스위 즐링을 사용했습니다.

import Foundation
import UIKit

private func _swizzling(forClass: AnyClass, originalSelector: Selector, swizzledSelector: Selector) {
    if let originalMethod = class_getInstanceMethod(forClass, originalSelector),
       let swizzledMethod = class_getInstanceMethod(forClass, swizzledSelector) {
        method_exchangeImplementations(originalMethod, swizzledMethod)
    }
}

extension UIViewController {

    static let preventPageSheetPresentation: Void = {
        if #available(iOS 13, *) {
            _swizzling(forClass: UIViewController.self,
                       originalSelector: #selector(present(_: animated: completion:)),
                       swizzledSelector: #selector(_swizzledPresent(_: animated: completion:)))
        }
    }()

    @available(iOS 13.0, *)
    @objc private func _swizzledPresent(_ viewControllerToPresent: UIViewController,
                                        animated flag: Bool,
                                        completion: (() -> Void)? = nil) {
        if viewControllerToPresent.modalPresentationStyle == .pageSheet
                   || viewControllerToPresent.modalPresentationStyle == .automatic {
            viewControllerToPresent.modalPresentationStyle = .fullScreen
        }
        _swizzledPresent(viewControllerToPresent, animated: flag, completion: completion)
    }
}

이걸 넣어

UIViewController.preventPageSheetPresentation

어딘가에

예를 들어 AppDelegate에서

func application(_ application: UIApplication,
                 didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]?) -> Bool {

    UIViewController.preventPageSheetPresentation
    // ...
    return true
}

3
여러 모달이있는 경우 가장 쉬운 솔루션입니다.
Raisal Calicut

어딘가는 어떤 파일 또는 전체 프로젝트의 위치를 ​​의미합니다
Yatendra

어딘가에 당신, 내가 AppDelegate에에 넣어 static let가 계산 될 수 있도록 그것을 읽고, 당신은 게으른 한되고, 게으른 var에 한 번만 계산, 내가 한 번만 호출 스위 즐링 보장을 가지고 그것을 사용
막심 Ashurov

37

Objective-C 사용자의 경우

이 코드를 사용하십시오

 [vc setModalPresentationStyle: UIModalPresentationFullScreen];

또는 iOS 13.0에서 특정 항목을 추가하려면

 if (@available(iOS 13.0, *)) {
     [vc setModalPresentationStyle: UIModalPresentationFullScreen];
 } else {
     // Fallback on earlier versions
 }

2
이것은 이전 iOS 버전에서도 작동하지만 대답은 좋습니다
Catalin

4
UIModalPresentationFullScreen은 iOS 3.2 이상에서 작동합니다. 따라서 다른 조건을 추가 할 필요가 없습니다.
flame3

2
iOS 13.1.2에서는 Obj-c 클래스에서만 어떤 이유로 든 작동하지 않으며 modalPresentationStyle은 pageSheet 만 표시합니다. 이것은 다른 사람에게 일어나고 있습니까?
Sevy11

Sevy11 @ I는 13.1에서 아이폰 OS 13.1.2하지만 작업 벌금 업데이트하지 않은
9to5ios

안녕하세요 @ Sevy11 내 아이폰 OS 13.1.2 및 그 작업 벌금을 업데이트해야, 최종에서 확인하시기 바랍니다
9to5ios

36

짧막 한 농담:

modalPresentationStyle표시되는 navigationController에서 설정해야합니다 .


아이폰 OS (13)와 아이폰 OS 버전의 전체 화면 아래 overCurrentContextnavigationController

테스트 된 코드

let controller = UIViewController()
let navigationController = UINavigationController(rootViewController: controller)
navigationController.modalPresentationStyle = .overCurrentContext
self.navigationController?.present(navigationController, animated: true, completion: nil)

modalPresentationStylenavigationController 에서 설정해야합니다 .


설명 : navigationController에서 viewController를 제시하면 navigationController에서 modalPresentationStyle을 설정할 필요가 없습니다. 대신 표시되는 viewController에 설정됩니다. 그러나 navigationController를 제공하는 경우 'modalPresentationStyle'속성은 임베디드 viewController가 아닌 navigationController에서 설정해야합니다. 이 접근법은 iOS 13.3, Xcode 11.3에서 작동합니다. Yogesh Bharate의 답변을 참조하십시오.
울림

@ 프라 틱 소다. 이것에 대한 도움? stackoverflow.com/questions/61429600/…
david

이것에 어떤 도움을 @Womble stackoverflow.com/questions/61429600/...
데이비드

25

힌트로 : ViewController안에 포함 된 에 대한 전화를 하면 VC가 아닌 NavigationController로 설정해야 NavigationController합니다 .fullScreen.

@davidbates와 같이하거나 프로그래밍 방식으로 수행 할 수 있습니다 (@pascalbros와 같은).

시나리오 예 :

여기에 이미지 설명을 입력하십시오

    //BaseNavigationController: UINavigationController {}
    let baseNavigationController = storyboard!.instantiateViewController(withIdentifier: "BaseNavigationController")
    var navigationController = UINavigationController(rootViewController: baseNavigationController)
    navigationController.modalPresentationStyle = .fullScreen
    navigationController.topViewController as? LoginViewController
    self.present(navigationViewController, animated: true, completion: nil)

21

나는 둘 다해야했다.

  1. 프리젠 테이션 스타일을 전체 화면으로 설정

    전체 화면

  2. 상단 막대를 반투명 탐색 막대로 설정

상단 바


Simulated Metrics의 일부 옵션이 프리젠 테이션 스타일을 변경하는 데 도움이된다는 매우 이상한 가정입니다
Alexander Kulabukhov

14

modalPresentationStyle발표 전 변경

vc.modalPresentationStyle = UIModalPresentationFullScreen;

13

다음은 한 줄을 코딩하지 않고 쉬운 솔루션입니다.

  • 스토리 보드에서 View Controller 선택
  • 속성 관리자 선택
  • 아래 이미지에 따라 프레젠테이션 "자동"을 "전체 화면"으로 설정하십시오.

이 변경으로 인해 iPad 앱이 예상대로 작동하지 않으면 새 화면이 화면 중앙에 팝업으로 표시됩니다.

여기에 이미지 설명을 입력하십시오


여기서 중요한 것은 NavigationController 에서이 작업을 수행 한 것입니다. 그림은 표시하지만 텍스트는이 방법으로 말하지 않습니다.
Andy Weinstein

1
또한 후속 말이 "모두로 표시"가 아닌 "표시"인지 확인
Andy Weinstein

좋아, 그래서 이것은 탭 바 컨트롤러를 사용하여 다른보기를 제어 할 때 효과가있는 것 같습니다. 그러나 다른 모든보기를 제어하므로 실제 'Tab Bar Controller'의 프리젠 테이션을 전체 화면으로 설정해야합니다.
찰리

12

임베디드 내비게이션 컨트롤러가있는 스크린이있는 UITabController가있는 경우 아래 그림과 같이 UITabController 프리젠 테이션 을 전체 화면으로 설정해야 합니다.

여기에 이미지 설명을 입력하십시오


12

Objective-C의 솔루션은 다음과 같습니다.

UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
ViewController *vc = [storyBoard instantiateViewControllerWithIdentifier:@"ViewController"];

vc.modalPresentationStyle = UIModalPresentationFullScreen;

[self presentViewController:vc animated:YES completion:nil];

10

iOS 13 및 Swift 5.x에 최신

let vc = ViewController(nibName: "ViewController", bundle: nil)

vc.modalPresentationStyle = .fullScreen

self.present(vc, animated: true, completion: nil)

9

다음은 카테고리를 사용하는 ObjectiveC의 수정 버전입니다. 이 접근 방식을 사용하면 다른 것이 명시 적으로 설정 될 때까지 기본 UIModalPresentationStyleFullScreen 동작을 갖게됩니다.

#import "UIViewController+Presentation.h"
#import "objc/runtime.h"

@implementation UIViewController (Presentation)

- (void)setModalPresentationStyle:(UIModalPresentationStyle)modalPresentationStyle {
    [self setPrivateModalPresentationStyle:modalPresentationStyle];
}

-(UIModalPresentationStyle)modalPresentationStyle {
    UIModalPresentationStyle style = [self privateModalPresentationStyle];
    if (style == NSNotFound) {
        return UIModalPresentationFullScreen;
    }
    return style;
}

- (void)setPrivateModalPresentationStyle:(UIModalPresentationStyle)modalPresentationStyle {
    NSNumber *styleNumber = [NSNumber numberWithInteger:modalPresentationStyle];
     objc_setAssociatedObject(self, @selector(privateModalPresentationStyle), styleNumber, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (UIModalPresentationStyle)privateModalPresentationStyle {
    NSNumber *styleNumber = objc_getAssociatedObject(self, @selector(privateModalPresentationStyle));
    if (styleNumber == nil) {
        return NSNotFound;
    }
    return styleNumber.integerValue;
}

@end

.h 파일이 있습니까?
Pedro Góes

@ PedroGóes 네,하지만 그것은 단지 범주 선언으로 구성되어```@ 인터페이스의 UIViewController (프리젠 테이션) @end```
알렉산더 Kulabukhov

스토리 보드의 모든 컨트롤러를 다루지 않으려면 이것을 사용하십시오! 시간 절약, 감사합니다!
AnthoPak

7

다른 모든 대답은 충분하지만 우리와 같은 큰 프로젝트와 코드와 스토리 보드 모두에서 탐색이 수행되는 곳은 상당히 어려운 작업입니다.

여기에 이미지 설명을 입력하십시오

스토리 보드를 적극적으로 사용하는 사람들을 위해. 이것은 내 조언입니다 : Regex를 사용하십시오.

다음 형식은 전체 화면 페이지에 적합하지 않습니다.

<segue destination="Bof-iQ-svK" kind="presentation" identifier="importSystem" modalPresentationStyle="fullScreen" id="bfy-FP-mlc"/>

다음 형식은 전체 화면 페이지에 적합합니다.

<segue destination="7DQ-Kj-yFD" kind="presentation" identifier="defaultLandingToSystemInfo" modalPresentationStyle="fullScreen" id="Mjn-t2-yxe"/>

VS CODE와 호환되는 다음 정규식은 모든 이전 스타일 페이지를 새 스타일 페이지로 변환합니다. 다른 정규식 엔진 / 텍스트 편집기를 사용하는 경우 특수 문자를 이스케이프해야 할 수도 있습니다.

정규식 검색

<segue destination="(.*)"\s* kind="show" identifier="(.*)" id="(.*)"/>

정규식 교체

<segue destination="$1" kind="presentation" identifier="$2" modalPresentationStyle="fullScreen" id="$3"/>

4

처음에는 기본값이 fullscreenmodalPresentationStyle이지만 iOS 13 에서는로 변경됩니다 UIModalPresentationStyle.automatic.

전체 화면보기 컨트롤러를 만들려면로 변경해야 modalPresentationStyle합니다 fullScreen.

자세한 내용은 UIModalPresentationStyle 애플 설명서 를 참조하고 어느 양식을 사용해야하는지에 대한 애플 휴먼 인터페이스 지침 을 참조하십시오 .


navigationController에서 viewController를 표시하려는 경우 iOS 13.3, Xcode 11.3부터 ​​정답입니다. .overFullScreen의 modalPresentationStyle도 작동합니다. 그러나 navigationController를 제시하는 경우 viewController가 아닌 navigationController에서 'modalPresentationStyle'을 설정해야합니다. 건배.
울림

3

쉽게 할 수 있습니다 스토리 보드를 소스 코드로 kind="presentation"열고을 검색 하십시오. kind = presentation 인 모든 시그 태그에서 추가 속성 추가modalPresentationStyle="fullScreen"


2
let Obj = MtViewController()
Obj.modalPresentationStyle = .overFullScreen
self.present(Obj, animated: true, completion: nil)

// 스 와이프하여 사용하지 않도록 설정하려면 줄을 추가하십시오.

Obj.isModalInPresentation = true

자세한 정보는 Apple 문서 를 확인하십시오 .


2

스위 즐링 방법 (Swift 4.2)을 사용하여 달성했습니다.

다음과 같이 UIViewController 확장을 작성하려면

extension UIViewController {

    @objc private func swizzled_presentstyle(_ viewControllerToPresent: UIViewController, animated: Bool, completion: (() -> Void)?) {

        if #available(iOS 13.0, *) {
            if viewControllerToPresent.modalPresentationStyle == .automatic || viewControllerToPresent.modalPresentationStyle == .pageSheet {
                viewControllerToPresent.modalPresentationStyle = .fullScreen
            }
        }

        self.swizzled_presentstyle(viewControllerToPresent, animated: animated, completion: completion)
    }

     static func setPresentationStyle_fullScreen() {

        let instance: UIViewController = UIViewController()
        let aClass: AnyClass! = object_getClass(instance)

        let originalSelector = #selector(UIViewController.present(_:animated:completion:))
        let swizzledSelector = #selector(UIViewController.swizzled_presentstyle(_:animated:completion:))

        let originalMethod = class_getInstanceMethod(aClass, originalSelector)
        let swizzledMethod = class_getInstanceMethod(aClass, swizzledSelector)
        if let originalMethod = originalMethod, let swizzledMethod = swizzledMethod {
        method_exchangeImplementations(originalMethod, swizzledMethod)
        }
    }
}

AppDelegate의 application : didFinishLaunchingWithOptions에서 다음을 호출하여 스위 즐링 코드를 호출하십시오.

UIViewController.setPresentationStyle_fullScreen()

1

이것은 나를 위해 일했다 :

yourViewController.modalPresentationStyle = UIModalPresentationStyle.fullScreen


3
이것은 다른 모든 기존 답변에 아무것도 추가하지 않습니다.
rmaddy

1

UIViewController에 대한 카테고리를 작성하십시오 (예 : UIViewController + PresentationStyle). 다음 코드를 추가하십시오.

 -(UIModalPresentationStyle)modalPresentationStyle{
     return UIModalPresentationStyleFullScreen;
}

이것은 UISearchController를 중단 + 충돌을 디버그하기 어려운 일부 트리거
dklt

@dklt 훌륭한 관찰입니다. 따라서 속성을 명시 적으로 설정하면 문제가 해결됩니다. UISearchController를 사용하는 경우 더 간단한 솔루션이 없습니다.
Govind

0

다른 방법은 앱에 자체 기본 뷰 컨트롤러 구성 요소를 배치하고 다음과 같은 기본 설정으로 지정된 초 기자 (initializer)를 구현하는 것입니다.

class MyBaseViewController: UIViewController {

//MARK: Initialisers

/// Alternative initializer which allows you to set the modal presentation syle
/// - Parameter modalStyle: the presentation style to be used
init(with modalStyle:UIModalPresentationStyle) {
    super.init(nibName: nil, bundle: nil)
    self.setup(modalStyle: modalStyle)
}

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    // default modal presentation style as fullscreen
    self.setup(modalStyle: .fullScreen)
}

required init?(coder: NSCoder) {
    super.init(coder: coder)
    // default modal presentation style as fullscreen
    self.setup(modalStyle: .fullScreen)
}

//MARK: Private

/// Setup the view
///
/// - Parameter modalStyle: indicates which modal presentation style to be used
/// - Parameter modalPresentation: default true, it prevent modally presented view to be dismissible with the default swipe gesture
private func setup(modalStyle:UIModalPresentationStyle, modalPresentation:Bool = true){
    if #available(iOS 13, *) {
        self.modalPresentationStyle = modalStyle
        self.isModalInPresentation = modalPresentation
    }
}

참고 : 뷰 컨트롤러가 실제로 모달로 제공되는 내비게이션 컨트롤러에 포함 된 경우 내비게이션 컨트롤러는 동일한 방식으로 문제에 접근해야합니다 (즉, 사용자 지정 내비게이션 컨트롤러 구성 요소를 동일한 방식으로 사용자 지정하도록 함)

iOS 13.1 및 iOS 12.4의 Xcode 11.1에서 테스트되었습니다.

그것이 도움이되기를 바랍니다.


0

더 이상 전체 화면을 표시하지 않는 비디오에서이 문제가 발생했습니다. 이 줄을 추가하여 하루를 절약했습니다 :-)

videoController.modalPresentationStyle = UIModalPresentationFullScreen;

2
이것은 다른 모든 기존 답변에 아무것도 추가하지 않습니다.
rmaddy

0

나를 위해 일한 가장 간단한 솔루션.

viewController.modalPresentationStyle = .fullScreen

3
이것은 다른 모든 기존 답변에 아무것도 추가하지 않습니다.
rmaddy

0

UINavigationController를 사용하고 ViewController를 루트보기 컨트롤러로 포함하면 동일한 문제가 발생합니다. 다음 코드를 사용하여 극복하십시오.

let vc = UIViewController()
let navController = UINavigationController(rootViewController: vc)
navController.modalPresentationStyle = .fullScreen

0
class MyViewController: UIViewController {

    convenience init() {
        self.init(nibName:nil, bundle:nil)
        self.modalPresentationStyle = .fullScreen
    }

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

self.modalPresentationStyle = .fullScreen모든 뷰 컨트롤러를 호출 하는 대신 UIViewController를 서브 클래 싱하고 MyViewController어디서나 사용할 수 있습니다.


-1

위의 답변과 제안은 옳으며 아래는 다른 버전이며 프로그래밍 방식으로 효율적으로 사용하는 방법입니다.

# 1 UIView 확장 생성

# 2 메소드 생성 ()

//#1
extension UIViewController {

//#2
func presentLocal(_ viewControllerToPresent: UIViewController, animated flag: 
Bool, completion: (() -> Void)? = nil) {

//Reusing below 2 lines :-)
viewControllerToPresent.modalPresentationStyle = .overCurrentContext
self.present(viewControllerToPresent, animated: flag, completion: completion)

  }
}

아래와 같이 호출

let vc = MyViewController()
let nc = UINavigationController(rootViewController: vc)
sourceView.presentLocal(nc, animated: true, completion: nil)

또는

let vc = MyViewController()
sourceView.presentLocal(vc, animated: true, completion: nil)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.