UIViewController 위에 clearColor UIViewController 표시


150

나는이 UIViewController같은 전망을 하위 뷰 / 모달 위에 다른 UIViewController뷰, 같은과 서브 뷰 / 모달 투명해야하고 어떤 구성 요소가 표시되어야 하위 뷰에 추가됩니다. 문제는 내가 가지고있는 하위 뷰가 clearColor를 가지기 위해 검은 색 배경을 표시한다는 것입니다. UIView검은 색이 아닌 clearColor 로 만들려고합니다 . 아무도 무엇이 잘못되었는지 알고 있습니까? 모든 제안에 감사드립니다.

FirstViewController.m

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];

[vc setModalPresentationStyle:UIModalPresentationFullScreen];
[self presentModalViewController:vc animated:NO];  

SecondViewController.m

- (void)viewDidLoad 
{
     [super viewDidLoad];
     self.view.opaque = YES;
     self.view.backgroundColor = [UIColor clearColor];
}

해결 : 문제를 해결했습니다. iPhone과 iPad 모두에서 잘 작동합니다. 검정색 배경이없는 모달 뷰 컨트롤러는 clearColor / transparent입니다. 내가 변경해야 할 유일한 것은로 교체 한 UIModalPresentationFullScreenUIModalPresentationCurrentContext입니다. 얼마나 간단합니다!

FirstViewController.m

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
vc.view.backgroundColor = [UIColor clearColor];
self.modalPresentationStyle = UIModalPresentationCurrentContext;
[self presentViewController:vc animated:NO completion:nil];

주의 사항 :modalPresentationStyle 속성을 사용하는 경우 navigationController:

FirstViewController.m

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
vc.view.backgroundColor = [UIColor clearColor];
self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
[self presentViewController:vc animated:NO completion:nil];

주의 사항 : 나쁜 소식은 위의 솔루션이 iOS 7에서 작동하지 않는다는 것입니다. 좋은 소식은 iOS7의 문제를 해결했다는 것입니다! 나는 누군가에게 도움을 요청했고 여기에 그가 말한 것이 있습니다.

보기 컨트롤러를 모달로 표시 할 때 iOS는 표시되는 기간 동안보기 계층에서보기 컨트롤러를 제거합니다. 모달 표시 뷰 컨트롤러의 뷰는 투명하지만 그 아래에는 앱 창 (검은 색) 외에는 아무것도 없습니다. iOS 7은 새로운 모달 프레젠테이션 스타일을 도입하여 UIModalPresentationCustomiOS가 제시된 뷰 컨트롤러 아래의 뷰를 제거하지 못하게합니다. 그러나이 모달 프레젠테이션 스타일을 사용하려면 프레젠테이션을 처리하고 애니메이션을 해제 할 고유 한 전환 대리자를 제공해야합니다. 이 내용은 WWDC 2013 https://developer.apple.com/wwdc/videos/?id=218의 'View Controller를 사용한 사용자 정의 전환'대화에 요약되어 있으며, 자신의 전환 위임을 구현하는 방법도 다룹니다.

iOS7에서 위 문제에 대한 내 솔루션을 볼 수 있습니다 : https://github.com/hightech/iOS-7-Custom-ModalViewController-Transitions


1
rootViewController의 modalPresentationStyle을 설정했는지 확인하십시오. 그렇지 않으면 작동하지 않습니다.
Thorsten

이 답변에 대한 의견을 살펴보십시오. stackoverflow.com/a/25990081/1418457 , 그것은 작동합니다
onmyway133

stackoverflow.com/q/27598846/1603234 나를 웃게 해, 이제 네 차례 :)
Hemang

self.modalPresentationStyle = UIModalPresentationCurrentContext를 수행해야했습니다. 제시된 뷰 컨트롤러가 아니라 제시된 뷰 컨트롤러와 함께 작동합니다.
Tulleb

1
아래에서 Brody의 답변을 확인하십시오. modalViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext; 문제 해결합니다
GoodSp33d

답변:


143

iOS8 이상

iOS8 이상에서는 새로운 modalPresentationStyle UIModalPresentationOverCurrentContext를 사용하여 투명한 배경의 뷰 컨트롤러를 제공 할 수 있습니다.

MyModalViewController *modalViewController = [[MyModalViewController alloc] init];
modalViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;           
[self presentViewController:modalViewController animated:YES completion:nil];    

5
허용되는 답변이어야합니다. 이전에 수락 된 답변은 여전히 ​​레거시 이유로 유효하지만 이것이 권장되는 방법입니다.
Tomasz Bąk

3
iOS 8 전용으로 개발하는 경우이 답변을 사용하십시오! 작동
Mário Carvalho

2
이것은 좋지만 마지막 줄이 아니어야 [self presentViewController:modalViewController animated:YES completion:nil];합니까? (targetController 대신)?
SuperDuperTango

3
나를 위해 이것을 작동시키기 위해 솔루션 덕분에 modalViewController.view.backgroundColor = UIColor.clearColor ()를 추가했습니다
Pramod

누구든지 pushviewcontroller 코드를 제공 할 수 있습니까 (내비게이션 컨트롤러).
Alok

140

해결 : 문제를 해결했습니다. iPhone과 iPad 모두에서 잘 작동합니다. 검정색 배경이없는 모달 뷰 컨트롤러는 clearColor / transparent입니다. 변경해야 할 유일한 것은 UIModalPresentationFullScreen을 UIModalPresentationCurrentContext로 바꾼 것입니다. 얼마나 간단합니다!

FirstViewController.m

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
    vc.view.backgroundColor = [UIColor clearColor];
    self.modalPresentationStyle = UIModalPresentationCurrentContext;
    [self presentViewController:vc animated:NO completion:nil];

주의 사항 : navigationController의 modalPresentationStyle 특성을 사용하는 경우 :

FirstViewController.m

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
    vc.view.backgroundColor = [UIColor clearColor];
    self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
    [self presentViewController:vc animated:NO completion:nil];

주의 사항 : 나쁜 소식은 위의 솔루션이 iOS 7에서 작동하지 않는다는 것입니다. 좋은 소식은 iOS7의 문제를 해결했다는 것입니다! 나는 누군가에게 도움을 요청했고 여기에 그가 말한 것이 있습니다.

보기 컨트롤러를 모달로 표시 할 때 iOS는 표시되는 기간 동안보기 계층에서보기 컨트롤러를 제거합니다. 모달 표시 뷰 컨트롤러의 뷰는 투명하지만 그 아래에는 앱 창 (검은 색) 외에는 아무것도 없습니다. iOS 7은 새로운 모달 프레젠테이션 스타일 인 UIModalPresentationCustom을 도입하여 iOS가 제시된 뷰 컨트롤러 아래의 뷰를 제거하지 못하게합니다. 그러나이 모달 프레젠테이션 스타일을 사용하려면 프레젠테이션을 처리하고 애니메이션을 해제 할 고유 한 전환 대리자를 제공해야합니다. 이 내용은 WWDC 2013 https://developer.apple.com/wwdc/videos/?id=218의 'View Controller를 사용한 사용자 정의 전환'대화에 요약되어 있으며, 자신의 전환 위임을 구현하는 방법도 다룹니다.

iOS7에서 위 문제에 대한 내 솔루션을 볼 수 있습니다 : https://github.com/hightech/iOS-7-Custom-ModalViewController-Transitions


1
self.modalPresentationStyle = UIModalPresentationCurrentContext;그것을했다.
Adriano Lucas

4
btw .. self.modalPresentationStyle = UIModalPresentationCurrentContext 때문에; 그것은 애니메이션 .. 어떤 아이디어와 modalViewController를 제시하지 않습니다
Devarshi

1
@Miraaj는 다음의 UIViewController 일을해야 표시하기 전에 UIModalPresentationFullScreen에 modalPresentationStyle를 다시 설정self.modalPresentationStyle = UIModalPresentationFullScreen; [self performSegueWithIdentifier:@"CustomSegue" sender:self];
하이테크을

1
iOS 6 및 7에서이를 실행하면 프리젠 테이션에 애니메이션을 적용하는 동안 새 뷰 컨트롤러가 명확 해지지 만 일단 배치되면 배경이 검게 변합니다. 해고에 애니메이션을 적용하면 다시 명확 해집니다. 다른 사람 이이 문제를 겪었습니까?
Drew C

3
@ pkamb iOS 7 용 솔루션을 업데이트했습니다. stackoverflow.com/a/11252969/1344459 도움이 되길 바랍니다.
hightech

114

따라서 순수하게 시각적 인 사고 자와 스토리 보드 팬을 위해 다음을 수행 할 수 있습니다.

1. 뷰 컨트롤러 제시

컨텍스트 정의

2. 제시된 뷰 컨트롤러

프리젠 테이션 : 과전류 컨텍스트


이것이 정답입니다. 이것이 작동하려면 모달 컨트롤러에서보기의 배경색을 지우도록 설정하십시오.
Jesse

합의 된 스토리 보드 옵션이이 경우 코드를 덮어 씁니다.
C0D3

17
이 대답은 너무 달콤합니다. 이제 당뇨병이 있습니다.
GeneCode

25

스위프트 3 및 iOS10 솔루션 :

//create view controller
let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "RoadTripPreviewViewController")
//remove black screen in background
vc.modalPresentationStyle = .overCurrentContext
//add clear color background
vc.view.backgroundColor = UIColor.clear
//present modal
self.present(vc, animated: true, completion: nil)

16

이것은 컨트롤 드래그 세구를 사용하는 xCode 7 베타 4에서 가져온 것입니다. 목적지의 배경을 깨끗하게 설정하고 IB에서 segue 속성을 다음과 같이 설정하십시오 (참조 : 프레젠테이션은 "전체 화면 오버").

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


2
감사합니다. 나는 당신의 segue fix + @pasevin의 ViewControllers 답변을했고 그것은 효과가있었습니다!!
CSawy

1
이것은 내 질문에 대답했다. 대단히 감사합니다. 투표하다 : D
네이트 4436271

8

iOS7 및 iOS8에서 작동하는 가장 쉬운 방법은 iOS8 때문에 modallyPresentedVC (모달로 표시하려는 ViewController)의 presentationStyle을 UIModalPresentationOverCurrentContext에 추가하는 것입니다.

[modallyPresentedVC setModalPresentationStyle:UIModalPresentationOverCurrentContext];
[modallyPresentedVC.navigationController setModalPresentationStyle:UIModalPresentationOverCurrentContext];

iOS7로 인해 VC (모달로 제시된 컨트롤러)를 제공하는 UIModalPresentationCurrentContext :

[presentingVC setModalPresentationStyle:UIModalPresentationCurrentContext];
[presentingVC.navigationController setModalPresentationStyle:UIModalPresentationCurrentContext];

iOS7과 iOS8에서는 상황이 다르게 처리되기 때문입니다. 물론 navigationController 속성을 사용하지 않으면 설정할 필요가 없습니다. 희망이 도움이됩니다.


내 베이컨을 구 했어요! 감사합니다
Duck

5

스위프트 2 버전 :

let vc = self.storyboard!.instantiateViewControllerWithIdentifier("YourViewController") as! YourViewController
vc.view.backgroundColor = UIColor.clearColor()
vc.modalPresentationStyle = UIModalPresentationStyle.OverFullScreen // orOverCurrentContext to place under navigation
self.presentViewController(vc, animated: true, completion: nil)

4

다른 방법 (사용자 정의 전환을 만들 필요가 없으며 iOS 7에서 작동)

스토리 보드 사용하기 :

자유 크기의 Child View Controller를 만들고보기 너비를 500x500 (예 :)으로 설정하고 다음 방법을 추가하십시오.

- (void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];
    self.view.superview.bounds = CGRectMake(0, 0, 500, 500);
    self.view.superview.backgroundColor = [UIColor clearColor];
}

그런 다음 Form Sheet로 Modal segue를 작성하고 테스트하십시오.


진짜 대단한데!!! 이것은 실제로 작동합니다 !!! (IB에서 "자유"크기를 설정해도 시뮬레이션에 영향을 미치지 않습니다. 시뮬레이션 된 메트릭이지만 어쨌든 작동합니다 !!!) 그리고 너무 간단합니다 !!!
Radu Simionescu

4

맞춤형 segue가 포함 된 iOS 7 솔루션 :

CustomSegue.h
#import <UIKit/UIKit.h>

    @interface CustomSegue : UIStoryboardSegue <UIViewControllerTransitioningDelegate, UIViewControllerAnimatedTransitioning>

    @end



CustomSegue.m
#import "CustomSegue.h"

@implementation CustomSegue

-(void)perform {

    UIViewController* destViewController = (UIViewController*)[self destinationViewController];
    destViewController.view.backgroundColor = [UIColor clearColor];
    [destViewController setTransitioningDelegate:self];
    destViewController.modalPresentationStyle = UIModalPresentationCustom;
    [[self sourceViewController] presentViewController:[self destinationViewController] animated:YES completion:nil];
}


//===================================================================
// - UIViewControllerAnimatedTransitioning
//===================================================================

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

- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext {

    UIView *inView = [transitionContext containerView];
    UIViewController* toVC = (UIViewController*)[transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    UIViewController* fromVC = (UIViewController *)[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];

    [inView addSubview:toVC.view];

    CGRect screenRect = [[UIScreen mainScreen] bounds];
    [toVC.view setFrame:CGRectMake(0, screenRect.size.height, fromVC.view.frame.size.width, fromVC.view.frame.size.height)];

    [UIView animateWithDuration:0.25f
                     animations:^{

                         [toVC.view setFrame:CGRectMake(0, 0, fromVC.view.frame.size.width, fromVC.view.frame.size.height)];
                     }
                     completion:^(BOOL finished) {
                         [transitionContext completeTransition:YES];
                     }];
}


//===================================================================
// - UIViewControllerTransitioningDelegate
//===================================================================

- (id <UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source {

    return self;
}

- (id <UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed {
    //I will fix it later.
    //    AnimatedTransitioning *controller = [[AnimatedTransitioning alloc]init];
    //    controller.isPresenting = NO;
    //    return controller;
    return nil;
}

- (id <UIViewControllerInteractiveTransitioning>)interactionControllerForPresentation:(id <UIViewControllerAnimatedTransitioning>)animator {
    return nil;
}

- (id <UIViewControllerInteractiveTransitioning>)interactionControllerForDismissal:(id <UIViewControllerAnimatedTransitioning>)animator {
    return nil;
}

@end

하이테크 코드 기반 솔루션.


내가 [self dismissViewControllerAnimated : YES complete : NULL]; 나는 예외를 얻는다 ??
Asadullah Ali

이 코드는 그렇습니다. 또는 애니메이션 시작 작업을 위해 animationControllerForDismissedController 메소드를 구현해야합니다.
Max Gribov

4

나를 위해 이것은 작동합니다 :

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil];
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"MMPushNotificationViewController"];

    vc.view.backgroundColor = [UIColor clearColor];
    self.modalPresentationStyle = UIModalPresentationCurrentContext;
#ifdef __IPHONE_8_0
    if(IS_OS_8_OR_LATER)
    {
        self.providesPresentationContextTransitionStyle = YES;
        self.definesPresentationContext = YES;
        [vc setModalPresentationStyle:UIModalPresentationOverCurrentContext];
    }
#endif


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

MMPushNotificationViewControllerTransparent View 컨트롤러이며 투명도 MMPushNotificationViewController의보기 색을 만들었습니다. 이제 완료하고 Transparentviewcontroller를 만들었습니다.


2

iOS7의 경우

이제 iOS7 사용자 지정 전환을 사용하여이를 달성하는 방법이 있습니다.

MyController * controller = [MyController new];
[controller setTransitioningDelegate:self.transitionController];
controller.modalPresentationStyle = UIModalPresentationCustom;
[self controller animated:YES completion:nil];

사용자 정의 전환을 만들려면 다음 두 가지가 필요합니다.

  • TransitionDelegate 객체 (구현 <UIViewControllerTransitionDelegate>)
  • "AnimatedTransitioning"객체 (구현 <UIViewControllerAnimatedTransitioning>)

자습서 에서 사용자 정의 전환에 대한 자세한 정보를 찾을 수 있습니다 .


애니메이터 클래스에 mainviewcontroller와 second view controller 클래스를 추가 한 특별한 이유가 있습니까? 왜 직접 UIViewController를 사용하지 않았습니까? * toVC = (UIViewController *) [transitionContext viewControllerForKey : UITransitionContextToViewControllerKey]; UIViewController * fromVC = (UIViewController *) [transitionContext viewControllerForKey : UITransitionContextFromViewControllerKey];
Satyam Raikar

그것은 내 튜토리얼이 아니므로 이것에 대한 내용을 알지 못합니다. 당신의 요점은 유효합니다.
Kirualex

2

iOS7iOS8 에서 훌륭하게 작동

UIViewController* vc=[[UIViewController alloc]initWithNibName:@"VC" bundle:nil];

vc.view.alpha=0.7;
[vc setModalPresentationStyle:UIModalPresentationOverCurrentContext];

self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;

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

두 번째로 가장 좋은 답변의 사본.
Tomasz Bąk

2

창을보기에 '다시 추가'할 수도 있습니다.

OneViewController *vc = [[OneViewController alloc] init];
if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]) {
    [self presentViewController:vc animated:YES completion:nil];
} else {
    [self presentModalViewController:vc animated:YES];
}

[[[UIApplication sharedApplication] keyWindow] insertSubview:self.view atIndex:0];

이런 식으로 프레젠테이션을 애니메이션 할 수 있습니다.


1

iOS 7의 경우 Interface Builder를 사용해야 만 모달 프레젠테이션과 관련된 모든 뷰 컨트롤러에서 프레젠테이션을 "Over Current Context"로 설정하면됩니다. 네비게이션 컨트롤러도 마찬가지입니다.

예를 들어,이 모든 뷰 컨트롤러에서 설정하십시오.

NavController-> RootViewController-> ModalViewController

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


0

스토리 보드 / 인터페이스 빌더를 많이 사용하지는 않았지만 나에게 눈에 띄는 것은보기가 명확하게 표시되도록하고 (예 : 100 % 알파 / 시스루) 불투명하다는 것을 말하고 있다는 것입니다 ( 0 % 알파-완전히 단단함). 이 두 가지는 메쉬되지 않는 것 같습니다. 줄을 주석 처리하고 self.view.opaque = YES;그것이 작동하는지 확인하십시오.)

아, 방금 생각한 것-뷰 컨트롤러에 알파 배경이있을 수는 있지만 알파는 기본 창 또는 루트 뷰 컨트롤러의 색상으로 표시됩니다. 기본 검은 색입니다. 전체 앱의 기본 레이어는 투명한 배경을 가질 수 없습니다. 그 뒤에 무엇입니까? 투명성을 통해 볼 수있는 것이 있어야합니다. 말이 돼?


self.view.opaque = YES를 주석 처리하려고했습니다. 라인과 작동하지 않습니다. :-(
hightech

내 대답의 두 번째 부분을 읽었습니까? 설정에 따라 원하는 것을 수행하지 못할 수도 있습니다. clearColor VC 뒤에 무엇을 배치하고 있습니까? 어쩌면 우리는이 밖으로 ^^ 정렬 할 수 있습니다
WendiKidd

-3

보기를 제시 할 때 "self.modalPresentationStyle = UIModalPresentationCurrentContext;"를 사용하십시오.

잘 작동합니다 :)


1
이것은 기존 답변이 이미 말한 것을 반복합니다.
Pang
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.