[ios] iOS : 투명한 배경의 모달 ViewController

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

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

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



답변

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

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

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

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

모달 뷰

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

편집하다:

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


답변

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아무런 영향이 없습니다.

답변

위의 아이폰 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];

첨부 된 이미지 참조


답변

이 코드는 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
    }
}


답변

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

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

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

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


답변

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

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


답변

투명한 배경을 가진 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에서 배경색을 검은 색으로 설정하고 불투명도를 줄입니다.