iOS : 투명한 배경의 모달 ViewController


180

투명한 배경으로 뷰 컨트롤러를 모달로 제시하려고합니다. 내 목표는 제시 및 제시된 뷰 컨트롤러의 뷰를 동시에 표시하는 것입니다. 문제는 프리젠 테이션 애니메이션이 완료되면 프리젠 테이션 뷰 컨트롤러의 뷰가 사라진다는 것입니다.

- (IBAction)pushModalViewControllerButtonPressed:(id)sender
{
    ModalViewController *modalVC = [[ModalViewController alloc] init];
    [self presentViewController:modalVC animated:YES completion:nil];
}

뷰를 하위 뷰로 추가 할 수 있다는 것을 알고 있지만 어떤 이유로 든이 솔루션을 피하고 싶습니다. 어떻게 고칠 수 있습니까?


4
@TheKing Sound 나 같은 마이클은 모달 뷰가 반투명하고 기본 (프레젠테이션) 뷰 위에 떠오르는 젤 레이어로 나타나기를 원합니다. 다른 주요 기능 (별도보기)으로 이동하는 것과 달리 빠른 설정을하는 동안 사용자가 현재 컨텍스트에 머무르는 느낌을 만듭니다.
Basil Bourque

stackoverflow.com/q/27598846/1603234 날 웃게 만들어, 이제 네 차례 :)
Hemang

내 답변보기 here iOS 8 용 stackoverflow.com/a/29794201/1606125
Pankaj Wadhwa


1
iOS 10의 경우 아래 언급 된 inigo333과 같이 UIModalPresentationOverFullScreen이 작동합니다.
Josef Rysanek

답변:


97

이 코드는 iPad에서만 작동합니다.

self.view.backgroundColor = [UIColor clearColor];
self.modalPresentationStyle = UIModalPresentationCurrentContext;
[self presentModalViewController:modalVC animated:YES];

하위보기를 추가 할 것입니다.

여기에 좋은 토론이 있습니다. 구체적으로 의견을보십시오. 대답 만이 아닙니다.

모달 뷰

내가 당신이라면 나는 그것을하지 않을 것입니다. 하위보기를 추가하고 수행합니다. 그것은 나에게 더 나은 통제력을주는 것 같습니다.

편집하다:

Paul Linsay가 언급했듯이 iOS 8부터 필요한 것은 UIModalPresentationOverFullScreen표시되는 ViewController의 modalPresentationStyle뿐입니다. 이것은 또한 navigationBar 및 tabBar 버튼을 다룹니다.


18
그것은 않습니다 아이폰 OS 7에 대한 작업을하고 또한 아이폰에, 것은 당신이를 지정해야한다는 것입니다 modalPresentationStyle = UIModalPresentationCurrentContext발표자 보기 컨트롤러 및하지에서 발표 한.
redent84

6
그렇습니다.하지만 뷰 계층 구조 의 상위 ViewController 에서 설정 한 경우에만 작동 합니다. (예 : NavigationController슬라이드 메뉴보기 컨트롤러의 인스턴스 또는 인스턴스)
iGranDav 2016 년

4
이상하게도 필자의 경우 모달 스타일을로 설정 한 후에 만 ​​작동했으며 에서보다 오히려 UIModalPresentationCustom바로 설정되어있는 경우에만 작동했습니다 . presentViewControllerviewDidLoad
mojuba 2016 년

5
iOS 8부터 필요한 것은 표시되는 ViewController의 modalPresentationStyle에 대한 UIModalPresentationOverFullScreen입니다.
Paul Linsay

1
약 1000 번의 시도 후에, 나는 당신이 modalPresentationStyle 전에viewDidLoad 설정해야한다는 것을 깨달았습니다 . 나는 생성자에서 그것을했고 효과가 있었다.
bendytree

186

iOS 8에서이 기능을 사용하려는 경우 투명 모드 모달 뷰 컨트롤러를 표시하는 "Apple-approved"방법 modalPresentationStyle 은 현재 ed 컨트롤러 를 로 설정 하는 것 UIModalPresentationOverCurrentContext입니다.

코드에서 또는 스토리 보드에서 segue의 속성을 설정하여 수행 할 수 있습니다.

UIViewController 문서에서 :

UIModalPresentationOverCurrentContext

컨텐츠가 부모보기 컨트롤러의 컨텐츠에만 표시되는 프리젠 테이션 스타일입니다. 프리젠 테이션이 완료 될 때 제시된 컨텐츠 아래의보기는보기 계층에서 제거되지 않습니다. 따라서 제공된보기 컨트롤러가 화면에 불투명 한 내용을 채우지 않으면 기본 내용이 표시됩니다.

팝 오버에서 뷰 컨트롤러를 제시 할 때이 프리젠 테이션 스타일은 전환 스타일이 UIModalTransitionStyleCoverVertical 인 경우에만 지원됩니다. 다른 전환 스타일을 사용하려고하면 예외가 발생합니다. 그러나 부모 뷰 컨트롤러가 팝 오버 상태에 있지 않으면 다른 전환 스타일 (부분 컬 전환 제외)을 사용할 수 있습니다.

iOS 8.0 이상에서 사용 가능합니다.

https://developer.apple.com/documentation/uikit/uiviewcontroller

WWDC 2014의 'iOS 8의 View Controller Advancements'비디오가 이에 대해 자세히 설명합니다.

노트 :

  • 실제로 표시되지 않도록 제시된보기 컨트롤러에 선명한 배경색을 지정하십시오!
  • 제시 하기 전에 이것을 설정해야합니다. 즉, presentViewController에서이 매개 변수를 설정하면 viewDidLoad아무런 영향이 없습니다.

32
참고 -modalPresentationStyle 을 설정해야하는 대상 이 변경된 것으로 나타납니다 . 예를 들어 iOS 7 에서이 기능 을 사용하려면 모달을 UIModalPresentationCurrentContext 로 열려고하는 View Controller 의 modalPresentationStyle 을 설정 해야 했습니다 . 그러나 iOS8 에서이 기능을 사용하려면 UIModalPresentationOverCurrentContext 로 표시 될 모달보기 의 modalPresentationStyle 을 설정 해야 했습니다 .
u2Fan

1
스토리 보드에서 segue를 사용하는 경우 프리젠 테이션 스타일을 설정해야합니다. 적어도 이것이 나를 위해 일한 것입니다.
Julian B.

제시된 뷰 컨트롤러의 init 메소드에이 세 줄을 추가했으며 참처럼 작동합니다. self.providesPresentationContextTransitionStyle = YES; self.definesPresentationContext = 예; [self setModalPresentationStyle : UIModalPresentationOverCurrentContext];
inigo333

2
iOS 8 이상에서는 UINavigationController에서 모달을 제시해야 했으므로 아이에게 제시해도 필요한 것을 제공하지 못했습니다. 대신 sourceVC입니다 self.navigationController. 또한 대상 프레젠테이션 스타일을 사용자 지정으로 설정 한 후에 만 ​​볼 수있었습니다. [sourceVC setModalPresentationStyle:UIModalPresentationCurrentContext];, [targetVC setModalPresentationStyle:UIModalPresentationCustom];희망은 사람을 도움이 될 것입니다.
devdc

참고- 제시된 VC presentedVC.modalPresentationStyle = UIModalPresentationOverCurrentContext에서 전화 하십시오 . presentVC에서 작동하지 않습니다. 날 믿어 봐
smileham 2016 년

104

위의 아이폰 OS 8.0과는 속성 설정하여 수행 할 수 있습니다 modalPresentationStyle을UIModalPresentationOverCurrentContext

//Set property **definesPresentationContext** YES to avoid presenting over presenting-viewController's navigation bar

self.definesPresentationContext = YES; //self is presenting view controller
presentedController.view.backgroundColor = [YOUR_COLOR with alpha OR clearColor]
presentedController.modalPresentationStyle = UIModalPresentationOverCurrentContext;

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

첨부 된 이미지 참조


5
이것이 내가 일할 수있는 유일한 솔루션입니다. 매우 간단합니다. 모달 segue 전에 제시하는 VC에 이것을 추가하십시오.
Siriss

1
Xcoe 9.2 / iOS 11.2는 신속 .custom하고 .overFullScreen작동합니다.
William Hu

.overFullScreen현재보기 컨트롤러 를 설정 하면 viewWillAppear호출되지 않습니다.
William Hu

한가지 더, presentedController.view.backgroundColor = #color#작성되어야 presentedControllerviewDidLoad, 또는 다른 사람 presentedController의 생명은 중단된다.
DawnSong

44

이 코드는 iOS6 및 iOS7의 iPhone에서 제대로 작동합니다.

presentedVC.view.backgroundColor = YOUR_COLOR; // can be with 'alpha'
presentingVC.modalPresentationStyle = UIModalPresentationCurrentContext;
[presentingVC presentViewController:presentedVC animated:YES completion:NULL];

이 경우 슬라이드 온 애니메이션이 누락됩니다. 애니메이션을 유지하려면 다음과 같은 "비 우아한"확장명을 계속 사용할 수 있습니다.

[presentingVC presentViewController:presentedVC animated:YES completion:^{
    [presentedVC dismissViewControllerAnimated:NO completion:^{
        presentingVC.modalPresentationStyle = UIModalPresentationCurrentContext;
        [presentingVC presentViewController:presentedVC animated:NO completion:NULL];
    }];
}];

presentingV가 UINavigationController 또는 UITabbarController 내부에있는 경우 presentingVC로 해당 컨트롤러와 함께 작동해야합니다.

또한 iOS7에서는 사용자 정의 전환 애니메이션 적용 UIViewControllerTransitioningDelegate프로토콜을 구현할 수 있습니다 . 물론이 경우 투명한 배경을 얻을 수 있습니다

@interface ModalViewController : UIViewController <UIViewControllerTransitioningDelegate>

먼저, 발표하기 전에 설정해야합니다 modalPresentationStyle

modalViewController.modalPresentationStyle = UIModalPresentationCustom;

그런 다음 두 가지 프로토콜 메소드를 구현해야합니다.

- (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source
{
    CustomAnimatedTransitioning *transitioning = [CustomAnimatedTransitioning new];
    transitioning.presenting = YES;
    return transitioning;
}

- (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed
{
    CustomAnimatedTransitioning * transitioning = [CustomAnimatedTransitioning new];
    transitioning.presenting = NO;
    return transitioning;
}

마지막으로 CustomAnimatedTransitioning수업 에서 사용자 정의 전환을 정의하는 것입니다

@interface CustomAnimatedTransitioning : NSObject <UIViewControllerAnimatedTransitioning>
@property (nonatomic) BOOL presenting;
@end

@implementation CurrentContextTransitionAnimator

- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext 
{
    return 0.25;
}

- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext 
{
    UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

    if (self.presenting) {
        // custom presenting animation
    }
    else {
        // custom dismissing animation
    }
}

7
이것이 작동하는지 확인했습니다. 당신의 ViewController가있는 navigationController 내부에있는 경우 다음의가 있는지 확인 modalPresentationStyle도 설정됩니다!
mxcl

가장 일반적인 경우 탐색 컨트롤러를 presentingVC로 취급하는 것이 좋습니다.
malex December

예,이 modalPresentationStyle을 사용하여 애니메이션을 표현할 수 없습니다 ((
malex

2
@ alex yes 죄송합니다. 제 실수는 prenstingVC 대신에 presentVC에 대해 modalPresentationStyle을 UIModalPresentationCurrentContext로 설정하는 것입니다.
tiguero

5
@mxcl 그리고 viewController의 navigationController 자체가 tabBarController 안에 있다면 modalPresentationStyle도 설정되어 있는지 확인하십시오;)
Thomas CG de Vilhena

21

@VenuGopalTewari가 제안한 것처럼 프리젠 테이션 스타일을 설정하기 위해 XCode 7의 인터페이스 빌더와 약간의 어려움을 겪었습니다. 이 버전에서는 더있을 것 같다 Over Current Context또는 Over Full ScreenSEGUE에 대한 프리젠 테이션 모드. 따라서 작동하도록 모드를 Default다음과 같이 설정했습니다 .

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

또한 모달 표시 뷰 컨트롤러의 프레젠테이션 모드를 다음과 같이 설정했습니다 Over Full Screen.

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


이것은 코드가 필요하지 않은 저에게 효과적이었습니다. 나는 Xcode 7.2를 사용하고 있으며, 목표는 iOS 8.0입니다
LightMan

이것은 나에게도 효과가있었습니다. 정답은 +1입니다. 감사합니다 :)
Augustine PA

여기에 최고의 답변!
shinyuX

1
코드 없음 = 최상의 답변. 바스티안이이기는 게임입니다. Plz 모두이 답변을 +1합니다.
GeneCode

이 답변은 효과가있었습니다 .. 이것에 대해 1 시간 이상을 보내고
user578386

18

모달로 표현할 segue를 만들고 해당 segue의 Presentation 속성을 현재 컨텍스트보다 높게 설정하면 100 % 작동합니다.

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


3
나는 100 % 확신에 감탄했습니다. 열쇠는 segue에 적용하는 것입니다. 대단히 감사합니다
Badr

당신이 당신의 SEGUE가 버튼에 매여하지 않고 프로그래밍을 호출하는 경우 다음 확인 식별자를 설정하는 대신 presentViewController의 performSegueWithIdentifier 호출 할 수 있도록
user3344977

1
나는 다른 모든 대답을 시도했지만 이것이 iOS9에서 나를 위해 일한 유일한 것입니다.
endavid

14

투명한 배경을 가진 PresentViewController-iOS 8 및 iOS 9

MYViewController *myVC = [self.storyboard   instantiateViewControllerWithIdentifier:@"MYViewController"];
    myVC.providesPresentationContextTransitionStyle = YES;
    myVC.definesPresentationContext = YES;
    [myVC setModalPresentationStyle:UIModalPresentationOverCurrentContext];
    [self.navigationController presentViewController:myVC animated:YES completion:nil];

그리고 MYViewController에서 배경색을 검은 색으로 설정하고 불투명도를 줄입니다.


12

약간 해 키지 만, 나 에게이 코드는 작동합니다 (iOS 6).

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

[self presentViewController:self.signInViewController animated:YES completion:^{
    [self.signInViewController dismissViewControllerAnimated:NO completion:^{
        appDelegate.window.rootViewController.modalPresentationStyle = UIModalPresentationCurrentContext;
        [self presentViewController:self.signInViewController animated:NO completion:nil];
        appDelegate.window.rootViewController.modalPresentationStyle = UIModalPresentationFullScreen;

    }];
}];

이 코드는 iPhone에서도 작동합니다


감사합니다. 이것은 정확히 필요한 것입니다. 메인 홈 상단에 초기 "도움말"화면이 표시됩니다. 아름다운!
Matt H

1
현재 iOS7과 iOS8 모두에서 작동하는 솔루션을 탐색하고 검색하는 데 거의 3 시간이 소요됩니다. 이 답변이 1.5 세이고 ECSlidingViewController를 사용하고 있다는 사실을 고려할 때 이것이 유일한 해결책입니다! 감사합니다 @Mak.
Centurion

완전한. 또한 애니메이션에 신경 쓰지 않으면 내부 완성의 3 줄이 완벽하게 작동합니다. 감사합니다!
RasTheDestroyer

D : 어떤 성공없이 보낸 3 시간이 발견 한 후, 건배, 내가 투표보다 최대 수 소원
alessioarsuffi

11

이 카테고리는 저에게 효과적이었습니다 (ios 7, 8 및 9)

H 파일

@interface UIViewController (navigation)
- (void) presentTransparentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion;
@end

M 파일

@implementation UIViewController (navigation)
- (void)presentTransparentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion
{
    if(SYSTEM_VERSION_LESS_THAN(@"8.0")) {
        [self presentIOS7TransparentController:viewControllerToPresent withCompletion:completion];

    }else{
        viewControllerToPresent.modalPresentationStyle = UIModalPresentationOverCurrentContext;
         [self presentViewController:viewControllerToPresent animated:YES completion:completion];
    }
}
-(void)presentIOS7TransparentController:(UIViewController *)viewControllerToPresent withCompletion:(void(^)(void))completion
{
    UIViewController *presentingVC = self;
    UIViewController *root = self;
    while (root.parentViewController) {
        root = root.parentViewController;
    }
    UIModalPresentationStyle orginalStyle = root.modalPresentationStyle;
    root.modalPresentationStyle = UIModalPresentationCurrentContext;
    [presentingVC presentViewController:viewControllerToPresent animated:YES completion:^{
        root.modalPresentationStyle = orginalStyle;
    }];
}
@end

1
나는 모든 답을 확인했다. 그러나 나를 위해 당신의 답은 완벽하다. "이것에 대한"+1 ". @ 테드
g212gs

1
나는 해결책을 찾을 수 없다고 생각했다. 고마워요!
CopperCash

10

swift를 사용한이 답변의 해결책은 다음과 같습니다.

let vc = MyViewController()
vc.view.backgroundColor = UIColor.clear // or whatever color.
vc.modalPresentationStyle = .overCurrentContext
present(vc, animated: true, completion: nil)

9

스토리 보드를 사용하는 경우 다음 단계를 수행 할 수 있습니다.

  1. 뷰 컨트롤러 (V2)를 추가하고 원하는 방식으로 UI를 설정하십시오.
  • UIView 추가-배경을 검은 색으로 설정하고 불투명도를 0.5로 설정
  • 팝업 역할을 할 다른 UIView (2)를 추가하십시오 (Pls는 UIView와 UIView (2)의 레벨 / 계층이 동일해야 함을 유의하십시오. UIView (2)에 영향을 미침
  1. V2 모달 제시

  2. segue를 클릭하십시오. 속성 관리자에서 프레젠테이션을 전체 화면 으로 설정 합니다. 원하는 경우 애니메이션 제거

스토리 보드

  1. V2를 선택하십시오. 속성 관리자에서 프레젠테이션을 전체 화면 으로 설정 합니다. 확인은 컨텍스트를 정의하고 컨텍스트를 제공합니다.

스토리 보드

  1. V2의 MainView를 선택하십시오 (Pls. Check image). backgroundColor를 Clear Color로 설정

스토리 보드


6

제시된 뷰 컨트롤러의 init 메소드에 다음 세 줄을 추가했으며 매력처럼 작동합니다.

self.providesPresentationContextTransitionStyle = YES;
self.definesPresentationContext = YES;
[self setModalPresentationStyle:UIModalPresentationOverCurrentContext];

편집 (iOS 9.3에서 작동) :

self.modalPresentationStyle = UIModalPresentationOverFullScreen;

설명서에 따라 :

UIModalPresentationOverFullScreen 제시된 뷰가 화면을 덮는 뷰 프리젠 테이션 스타일. 프리젠 테이션이 완료 될 때 제시된 컨텐츠 아래의보기는보기 계층에서 제거되지 않습니다. 따라서 제공된보기 컨트롤러가 화면에 불투명 한 내용을 채우지 않으면 기본 내용이 표시됩니다.

iOS 8.0 이상에서 사용 가능합니다.


1
iOS 10.2에서 작업.
Josef Rysanek

4

다른 방법은 "컨테이너 뷰"를 사용하는 것입니다. 알파를 1 미만으로 만들고 seque로 포함하십시오. XCode 5, iOS7을 대상으로합니다. iPhone에서 테스트되었습니다.

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

iOS6에서 사용 가능한 컨테이너보기. 그것에 관한 블로그 게시물 링크 .


3

필자는 "중첩 모달"이라고하는 것을 표현할 수있는 객체를 만들었습니다. 즉, 배경보기를 유지하고 투명한 배경을 가진 모달을 가질 수 있습니다.

이 작업을 수행하는 간단한 단일 방법이 있습니다.

- (void)presentViewController:(UIViewController *)presentedViewController
       fromViewController:(UIViewController *)presentingViewController
{
    presentedViewController.modalPresentationStyle = UIModalPresentationCustom;
    presentedViewController.transitioningDelegate = self;
    presentedViewController.modalPresentationCapturesStatusBarAppearance = YES;

    [presentedViewController setNeedsStatusBarAppearanceUpdate];

    [presentingViewController presentViewController:presentedViewController
                                       animated:YES
                                     completion:nil];
}

제시된 뷰 컨트롤러가 다른 경우 modalPresentationCapturesStatusBarAppearance속성을 로 설정하고 YES상태 표시 줄 모양을 강제로 업데이트 하는 것이 중요합니다.preferredStatusBarStyle .

이 개체는 @property (assign, nonatommic) isPresenting

이 객체가 UIViewControllerAnimatedTransitioningUIViewControllerTransitioningDelegate프로토콜 을 준수 하고 다음 방법을 구현 하기를 원합니다 .

- (id)animationControllerForPresentedController:(UIViewController *)presented
                           presentingController:(UIViewController *)presenting
                               sourceController:(UIViewController *)source
{
    self.isPresenting = YES;

    return self;
}

- (id)animationControllerForDismissedController:(UIViewController *)dismissed
{
    self.isPresenting = NO;

    return self;
}

과:

- (NSTimeInterval)transitionDuration:(id)transitionContext
{
    return 0.25;
}

- (void)animateTransition:(id)transitionContext
{
    UIViewController* firstVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController* secondVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    UIView* containerView = [transitionContext containerView];
    UIView* firstView = firstVC.view;
    UIView* secondView = secondVC.view;

    if (self.isPresenting) {
        [containerView addSubview:secondView];
        secondView.frame = (CGRect){
            containerView.frame.origin.x,
            containerView.frame.origin.y + containerView.frame.size.height,
            containerView.frame.size
        };

        firstView.tintAdjustmentMode = UIViewTintAdjustmentModeDimmed;
        [UIView animateWithDuration:0.25 animations:^{
            secondView.frame = containerView.frame;
        } completion:^(BOOL finished) {
            [transitionContext completeTransition:YES];
        }];
        } else {
        [UIView animateWithDuration:0.25 animations:^{
            firstView.frame = (CGRect){
                containerView.frame.origin.x,
                containerView.frame.origin.y + containerView.frame.size.height,
                containerView.frame.size
        };

        } completion:^(BOOL finished) {
            [transitionContext completeTransition:YES];
        }];
    }
}

기본 모달 애니메이션을 모방 한 하단에서 슬라이드 애니메이션을 수행하지만 원하는대로 만들 수 있습니다.

중요한 것은 제시하는 뷰 컨트롤러의 뷰가 뒤에 남아있어 투명 효과를 만들 수 있다는 것입니다.

이 솔루션은 iOS 7 이상에서 작동합니다


답변 주셔서 감사합니다.
Salman Khakwani

3

이 작업을 수행하는 매우 간단한 방법 Storyboards은 다음과 같습니다.

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"SomeStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SomeStoryboardViewController"];
// the key for what you're looking to do:
vc.modalPresentationStyle = UIModalPresentationOverCurrentContext;
vc.view.alpha = 0.50f;

[self presentViewController:vc animated:YES completion:^{
    // great success
}];

이것은을 발표 할 예정이다 UIViewControllerA의 Storyboard모달하지만 반투명 배경.


3

iOS 7-10 작업

if #available(iOS 8.0, *) {
    nextVC.modalPresentationStyle = .OverCurrentContext
    self.presentViewController(nextVC, animated: true, completion: nil)
} else {
    // Fallback on earlier version
    self.modalPresentationStyle = .Custom          
    nextVC.modalTransitionStyle = .CrossDissolve            
    self.presentViewController(nextVC, animated: false, completion: nil)
    }
}

2

여기에 모든 좋은 답변과 의견을 요약하고 새로운 것으로 이동하는 동안 여전히 애니메이션 ViewController 이것이 내가 한 일입니다. (iOS 6 이상 지원)

UINavigationController\를 사용하는 UITabBarController경우이 방법입니다.

    SomeViewController *vcThatWillBeDisplayed = [self.storyboard instantiateViewControllerWithIdentifier:@"SomeVC"];

    vcThatWillBeDisplayed.view.backgroundColor = [UIColor colorWithRed: 255/255.0 green:255/255.0 blue:255/255.0 alpha:0.50];    

    self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
    [self presentViewController:presentedVC animated:YES completion:NULL];

그렇게하면 modalTransitionStyle애니메이션 이 손실됩니다 . 이를 해결하기 위해 SomeViewController클래스에 쉽게 추가 할 수 있습니다 .

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [UIView animateWithDuration:0.4 animations:^() {self.view.alpha = 1;}
       completion:^(BOOL finished){}];
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.alpha = 0;
}

2

물론 UIModalPresentationCurrentContext를 설정해야하지만 clearColor를 설정하는 위치도 매우 중요합니다! viewDidLoad 함수에서 배경을 설정할 수 없으며, 루트보기 컨트롤러 또는 표시 할 컨트롤러 의 init 함수 에서처럼 뷰가로드되기 전에 설정하십시오 !

actionController.view.backgroundColor = [UIColor clearColor];
[self presentViewController:actionController animated:YES completion:nil];

또는

- (instancetype)init {

    self = [super initWithNibName:nil bundle:nil];

    if(self) {
        self.modalPresentationStyle = UIModalPresentationOverCurrentContext;
        [self.view setBackgroundColor:[UIColor clearColor]];
    }

    return self;
}

이것은 다른 사람들에게 도움이 된 힌트였습니다. 당신의 도움을 주셔서 감사합니다.
Tomasz Nazarenko

1

모달 세구를 사용하는 경우이 이미지로 설정해야합니다 (원하는 경우 애니메이션을 끌 수 있음)여기에 이미지 설명을 입력하십시오


1

iOS 7 및 iOS 8에서 테스트 된 완벽한 방법입니다.

@interface UIViewController (MBOverCurrentContextModalPresenting)

/// @warning Some method of viewControllerToPresent will called twice before iOS 8, e.g. viewWillAppear:.
- (void)MBOverCurrentContextPresentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion;

@end

@implementation UIViewController (MBOverCurrentContextModalPresenting)

- (void)MBOverCurrentContextPresentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion {
    UIViewController *presentingVC = self;

    // iOS 8 before
    if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_7_1) {
        UIViewController *root = presentingVC;
        while (root.parentViewController) {
            root = root.parentViewController;
        }

        [presentingVC presentViewController:viewControllerToPresent animated:YES completion:^{
            [viewControllerToPresent dismissViewControllerAnimated:NO completion:^{
                UIModalPresentationStyle orginalStyle = root.modalPresentationStyle;
                if (orginalStyle != UIModalPresentationCurrentContext) {
                    root.modalPresentationStyle = UIModalPresentationCurrentContext;
                }
                [presentingVC presentViewController:viewControllerToPresent animated:NO completion:completion];
                if (orginalStyle != UIModalPresentationCurrentContext) {
                    root.modalPresentationStyle = orginalStyle;
                }
            }];
        }];
        return;
    }

    UIModalPresentationStyle orginalStyle = viewControllerToPresent.modalPresentationStyle;
    if (orginalStyle != UIModalPresentationOverCurrentContext) {
        viewControllerToPresent.modalPresentationStyle = UIModalPresentationOverCurrentContext;
    }
    [presentingVC presentViewController:viewControllerToPresent animated:YES completion:completion];
    if (orginalStyle != UIModalPresentationOverCurrentContext) {
        viewControllerToPresent.modalPresentationStyle = orginalStyle;
    }
}

@end

1

스위프트 4.2

guard let someVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "someVC") as? someVC else {
    return
}
someVC.modalPresentationStyle = .overCurrentContext

present(someVC, animated: true, completion: nil)

0

appdelegate에서 :

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [[_window rootViewController]setModalPresentationStyle:UIModalPresentationCurrentContext];
    return YES;
}

다음보기를로드 해야하는 위치에서 첫 번째보기 컨트롤러 :

  NextViewController *customvc = [[NextViewController alloc]init];
    [self presentViewController:customvc animated:YES completion:^{

    }];

투명하게 추가 될 nextViewController에서 :

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor clearColor];
    UIView* backView = [[UIView alloc] initWithFrame:self.view.frame];
    backView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.6];
    [self.view insertSubview:backView atIndex:0];
}

0

로그인 화면은 모달이므로 이전 화면의 맨 위에 있습니다. 지금까지는 배경을 흐리게 처리했지만 아무 것도 흐리게하지 않습니다. 회색 배경 일뿐입니다.

모달을 올바르게 설정해야합니다.

이미지 링크 대상

  • 먼저 View Controller의 View 배경을 Clear color로 변경해야합니다. 그것은 단순히 투명해야 함을 의미합니다. 기본적으로 해당보기는 흰색입니다.

  • 둘째, 로그인 화면으로 연결되는 Segue를 선택하고 속성 관리자에서 프리젠 테이션을 Over Current Context로 설정해야합니다. 이 옵션은 자동 레이아웃 및 크기 클래스가 활성화 된 경우에만 사용할 수 있습니다.

이미지 링크 대상


0

설정 탐색의 modalPresentationStyleUIModalPresentationCustom

제시된 뷰 컨트롤러의 배경색을 선명한 색으로 설정하십시오.

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