투명한 배경으로 뷰 컨트롤러를 모달로 제시하려고합니다. 내 목표는 제시 및 제시된 뷰 컨트롤러의 뷰를 동시에 표시하는 것입니다. 문제는 프리젠 테이션 애니메이션이 완료되면 프리젠 테이션 뷰 컨트롤러의 뷰가 사라진다는 것입니다.
- (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 Screen
SEGUE에 대한 프리젠 테이션 모드. 따라서 작동하도록 모드를 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에서 배경색을 검은 색으로 설정하고 불투명도를 줄입니다.