programing

UIViewControllerContextTransition을 사용하여 "From ViewController"가 사라짐

goodsources 2023. 6. 5. 23:52
반응형

UIViewControllerContextTransition을 사용하여 "From ViewController"가 사라짐

한 가지 문제가 있는데 아래에 설명했습니다.

는 사용중을 하고 있습니다.UIViewControllerContextTransitioning사용자 지정 전환용.

나는 두 개의 뷰 컨트롤러, 첫 번째 뷰 컨트롤러와 두 번째 뷰 컨트롤러를 가지고 있습니다.

이제 애니메이션이 있는 첫 번째 뷰 컨트롤러에 두 번째 뷰 컨트롤러를 추가하려고 합니다.이제 두 번째 뷰 컨트롤러는 투명하므로 두 번째 뷰 컨트롤러 아래에서 첫 번째 뷰 컨트롤러를 볼 수 있습니다.

하지만 1차 뷰 컨트롤러가 보이지 않고, 2차 뷰 컨트롤러 아래에는 검은색 화면만 보입니다.

-(void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext{
    self.transitionContext = transitionContext;
    if(self.isPresenting){
        [self executePresentationAnimation:transitionContext];
    }
    else{
       [self executeDismissalAnimation:transitionContext];
    }
  }

-(void)executePresentationAnimation:(id<UIViewControllerContextTransitioning>)transitionContext{
     UIView* inView = [transitionContext containerView];
     UIViewController* toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

     UIViewController* fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];

     CGRect offScreenFrame = inView.frame;
     offScreenFrame.origin.y = inView.frame.size.height;
     toViewController.view.frame = offScreenFrame;

    toViewController.view.backgroundColor = [UIColor clearColor];
    fromViewController.view.backgroundColor = [UIColor clearColor];
    inView.backgroundColor = [UIColor  clearColor];
    [inView insertSubview:toViewController.view aboveSubview:fromViewController.view];
     // [inView addSubview:toViewController.view];
    CFTimeInterval duration = self.presentationDuration;
    CFTimeInterval halfDuration = duration/2;

    CATransform3D t1 = [self firstTransform];
    CATransform3D t2 = [self secondTransformWithView:fromViewController.view];

    [UIView animateKeyframesWithDuration:halfDuration delay:0.0 options:UIViewKeyframeAnimationOptionCalculationModeLinear animations:^{

    [UIView addKeyframeWithRelativeStartTime:0.0f relativeDuration:0.5f animations:^{
        fromViewController.view.layer.transform = t1;
    }];

    [UIView addKeyframeWithRelativeStartTime:0.5f relativeDuration:0.5f animations:^{
        fromViewController.view.layer.transform = t2;
    }];
    } completion:^(BOOL finished) {
    }];


    [UIView animateWithDuration:duration delay:(halfDuration - (0.3*halfDuration)) usingSpringWithDamping:0.7f initialSpringVelocity:6.0f options:UIViewAnimationOptionCurveEaseIn animations:^{
        toViewController.view.frame = inView.frame;
    } completion:^(BOOL finished) {
        [self.transitionContext completeTransition:YES];
    }];
}

[self.transitionContext completeTransition:YES];호출되면 갑자기 첫 번째 보기 컨트롤러가 사라지고 두 번째 보기 컨트롤러 아래에 검은 화면이 표시됩니다.

생각나는 사람?감사해요.

저도 여기서 같은 문제를 겪고 있었습니다. iOS 8의 버그처럼 보입니다.레이더를 설치했습니다.

화면이 검은색이 된 후 보기 계층을 검사하기 위해 노출을 사용했습니다.그 열쇠UIWindow완전히 비어 있습니다. 보기 계층 구조가 전혀 없습니다!

공개됨

제가 좀 놀았는데 간단한 경우에는 쉬운 해결책이 있는 것 같습니다.을 다시 하면 됩니다.toViewController창의: 키 창의 보기:

transitionContext.completeTransition(true)
UIApplication.sharedApplication().keyWindow!.addSubview(toViewController.view)

확인해보니 키창이rootViewController여전히 올바르게 설정되어 있으므로 괜찮습니다.이미 제시된 모달 컨트롤러 내에서 컨트롤러를 제시하면 어떤 일이 발생할지 확신할 수 없으므로, 더 복잡한 경우에는 실험을 수행해야 합니다.

저는 이 배경에 있는 이유가 더 잘 설명되어야 한다고 생각합니다.

보기는 표시되는 보기 컨트롤러의 보기를 원래 위치(보기 계층)에서 꺼내 컨테이너 안에 넣었기 때문에 사라집니다. 애니메이터가 제공하지만 애니메이션이 완료된 후에는 다시는 반환하지 않습니다.따라서 뷰 컨트롤러의 뷰는 해당 수퍼뷰(containerView)와 함께 창에서 완전히 제거됩니다.

iOS 7에서 시스템은 항상 전환이 자동으로 애니메이션을 마친 후 프레젠테이션(프레젠테이션 및 프레젠테이션)과 관련된 뷰 컨트롤러의 뷰를 원래 위치로 반환합니다.iOS 8의 일부 프레젠테이션 스타일에서는 더 이상 이러한 현상이 발생하지 않습니다.

규칙은 매우 간단합니다. 애니메이터는 전환이 끝날 때까지 해당 뷰 컨트롤러의 뷰가 완전히 가려질 경우에만 해당 뷰 컨트롤러의 뷰를 조작해야 합니다.즉, 초기 프레젠테이션 애니메이션이 완료된 후에는 프레젠테이션 컨트롤러의 뷰만 표시되고 프레젠테이션 컨트롤러의 뷰는 표시되지 않습니다.예를 들어, 표시된 뷰 컨트롤러의 뷰 불투명도를 50%로 설정하고 UIModal PresentationFullScreen을 사용하면 표시된 뷰 컨트롤러의 뷰를 표시 아래에서 볼 수 없지만 UIModal PresentationOverFullscreen을 사용하면 (UIPresentationController's)shouldRemovePresentersView방법은 다음을 지정합니다.).

애니메이터가 항상 표시 보기 컨트롤러의 보기를 조작하도록 허용하지 않는 이유는 무엇입니까?우선, 전체 프레젠테이션 수명 주기 동안 애니메이션이 완료된 후에도 프레젠테이션 컨트롤러의 보기가 계속 표시되는 경우에는 애니메이션을 만들 필요가 전혀 없으며 그대로 유지됩니다.둘째, 해당 뷰 컨트롤러에 대한 소유권이 프레젠테이션 컨트롤러로 이전되는 경우, 예를 들어 방향이 변경될 때 필요할 때 프레젠테이션 컨트롤러는 해당 뷰 컨트롤러의 뷰를 레이아웃하는 방법을 모를 가능성이 높지만, 프레젠테이션 뷰 컨트롤러의 원래 소유자는 변경할 수 있습니다.

8 iOS 8에서는viewForKey:메소드는 애니메이터가 조작하는 뷰를 얻기 위해 도입되었습니다.첫째, 애니메이터가 보기를 터치하면 안 될 때마다 0을 반환하여 위에서 설명한 규칙을 따르는 것이 좋습니다.둘째, 애니메이터가 애니메이션을 만들 다른 뷰를 반환할 수 있습니다.폼 시트와 유사한 프레젠테이션을 구현하고 있다고 가정해 보십시오.이 경우 표시된 뷰 컨트롤러의 뷰 주위에 그림자 또는 장식을 추가할 수 있습니다.애니메이터가 대신 해당 장식을 애니메이션화하고 제시된 뷰 컨트롤러의 뷰는 장식의 하위 뷰가 됩니다.

viewControllerForKey:이 기능은 사라지지 않으며, 보기 컨트롤러에 직접 액세스해야 하는 경우에도 사용할 수 있지만 애니메이터는 애니메이션에 필요한 보기에 대해 어떠한 가정도 해서는 안 됩니다.

애니메이터의 컨테이너 뷰 내에 명시적으로 배치할 때 표시 컨트롤러 뷰가 사라지는 문제를 올바르게 해결하려면 다음과 같은 몇 가지 작업을 수행할 수 있습니다.

  1. controller의가 없는 에는 표시보컨보애필경없우는요가할화를 합니다.viewForKey:컨트롤러의 뷰를 직접 보기 위해 손을 뻗는 대신 애니메이션으로 뷰를 가져옵니다. viewForKey: 또는 보기를 할 수 .0 또는완 보전다반 수있할다니습환를기른히▁may다0있니.

  2. 뷰 해야 합니다.UIModalPresentationFullScreen을 지정하거나 합니다.UIModalPresentationCustom를 사용자 UIP 컨션이러하로 합니다.shouldRemovePresentersViewYES이 은 사실, ▁present▁by▁in▁is▁definedllers▁internal▁the다▁the▁method▁controation니입rence.UIModalPresentationFullScreen그리고.UIModalPresentationCustom스타일은 사용자 정의 프레젠테이션 컨트롤러를 사용할 수 있다는 사실을 제외하고 있습니다.

  3. 다른 드문 경우에는 다른 답변이 제시한 대로 표시되는 보기 컨트롤러의 보기를 원래 위치로 되돌려야 합니다.

8에서는 8에서 해야 합니다.viewForKey: .view반된뷰컨의에서 한 뷰 viewControllerForKey: 위에 이 viewControllerForKey::

// Currently only two keys are defined by the
// system - UITransitionContextToViewControllerKey, and
// UITransitionContextFromViewControllerKey.
// Animators should not directly manipulate a view controller's views and should
// use viewForKey: to get views instead.
- (UIViewController *)viewControllerForKey:(NSString *)key;

프레임 에 그서프레등을조정는신대하임래▁etc▁so신대▁frames▁of▁of.toViewController.view은 의반환값사다니합용을▁the▁of다▁value를 합니다.[transitionContext viewForKey:UITransitionContextToViewKey].

앱에서 iOS7 및/또는 Xcode 5를 지원해야 하는 경우 다음과 같은 간단한 범주 방법을 UIViewController에서 사용할 수 있습니다.

- (UIView *)viewForTransitionContext:(id<UIViewControllerContextTransitioning>)transitionContext
{
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
    if ([transitionContext respondsToSelector:@selector(viewForKey:)]) {
        NSString *key = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey] == self ? UITransitionContextFromViewKey : UITransitionContextToViewKey;
        return [transitionContext viewForKey:key];
    } else {
        return self.view;
    }
#else
    return self.view;
#endif
}

여러분의 그럼, 의것을신을 .toViewController그리고.fromViewController평소와 같이, 그러나 사용하여 뷰를 얻습니다.[toViewController viewForTransitionContext:transitionContext].

편집: 다음에서 반환할 때 표시되는 보기 컨트롤러의 보기가 0인 버그가 있습니다.viewForKey이 기능을 사용하면 현재 보기를 전혀 애니메이션화하는 모달 전환을 수행할 수 없습니다(예: 미끄러짐 또는 플립-수평).iOS8 버그를 rdar://17961976 (http://openradar.appspot.com/radar?id=5210815787433984) 에 제출하였습니다.샘플 프로젝트는 http://github.com/bcherry/TransitionBug 에서도 확인할 수 있습니다.

파일 2: Gravelley 파일 UIModal Presentation FullScreen 파일입니다.아마도 이것은 버그가 아닐 것입니다.Apple은 UIModal Presentation Custom이 수신 모달의 보기만 수정하도록 의도할 수 있습니다.나가는 보기를 수정하려면 새 보기의 전체 화면 표시를 보장해야 합니까?어떤 경우에도 다음을 사용해야 합니다.viewForKey및 UIModal 프레젠테이션 전체 화면.

안 함 정 함modalPresentationStyleUIModal 프레젠테이션 커스텀입니다.

즉, UIModalPresentationCustom을 지정하는 대신 UIModalPresentationFullScreen의 기본값을 그대로 두면 사라지는 보기 문제가 해결되었습니다.UIViewControllerTransitioningDelegate 프로토콜은 이 프로토콜을 기본값으로 유지하는 경우에도 계속 적용되는 것으로 보입니다.제 기억이 맞다면, 옛날에는 UIModal Presentation Custom이 요구 사항이었습니다.

지금까지 작업은 상호작용하지 않는 애니메이션에 대해서만 시도했습니다.

Lefteris의 관련 스레드에서 매우 유용한 답변을 찾았습니다. https://stackoverflow.com/a/27165723/3709173

요약하자면:

  1. modal PresentationStyle을 로 설정합니다.관습
  2. 하위 클래스 UIPresentationController, 재정의 PresentersView 제거해야 함(NO 포함
  3. TransitionDelegate 클래스에서 PresentedViewController를 재정의하고 사용자 지정 UIPresentationController를 반환합니다.

+1 사용자 지정 전환에서 해고 애니메이션이 발생할 때 보기에 추가하지 않습니다.

여기서 시연:

해킹이 없는 https://www.dropbox.com/s/7rpkyamv9k9j18v/CustomModalTransition.zip?dl=0 ! 마치 마법 같아요! :)

[inView insertSubview: toViewController.view 위의 Subview: fromViewController.view] 대신 다음을 추가합니다. [inView addSubview: toViewController.view];

if (self.presenting) {

    [transitionContext.containerView addSubview:toViewController.view];
    // your code

} else {
    // your code
}

예를 볼 수 있습니다. 링크를 클릭하면 iOS 7과 iOS 8에서 작동합니다.

iOS 8에서는 UIPresentationController를 생성하고 아래의 방법을 UIViewController TransitioningDelegate에서 구현해야 합니다.

- (UIPresentationController *)presentationControllerForPresentedViewController:(UIViewController *)presented presentingViewController:(UIViewController *)presenting sourceViewController:(UIViewController *)source;

뷰 컨트롤러를 표시할 때 뷰 계층을 관리하는 데 사용할 사용자 지정 프레젠테이션 컨트롤러를 딜러에게 요청합니다.

반환 값:

모달 프레젠테이션을 관리하기 위한 사용자 지정 프레젠테이션 컨트롤러입니다.

토론:

UI Modal PresentationCustom 프레젠테이션 스타일을 사용하여 뷰 컨트롤러를 표시하면 시스템에서 이 메서드를 호출하고 사용자 지정 스타일을 관리하는 프레젠테이션 컨트롤러를 요청합니다.이 방법을 구현하는 경우 이 방법을 사용하여 프레젠테이션 프로세스를 관리하는 데 사용할 사용자 지정 프레젠테이션 컨트롤러 개체를 생성하고 반환합니다.

이 메서드를 구현하지 않거나 이 메서드의 구현이 0을 반환하는 경우 시스템은 기본 프레젠테이션 컨트롤러 개체를 사용합니다.기본 프레젠테이션 컨트롤러는 보기 계층에 보기 또는 내용을 추가하지 않습니다.

가용성은 iOS 8.0 이상에서 사용할 수 있습니다.

자세한 내용은 WWDC 2014 비디오를 참조하십시오.

https://developer.apple.com/videos/wwdc/2014/ ?sshd=228

WWDC의 샘플 코드인 "LookInside:WWDC 2014 샘플 코드 페이지에서 다운로드할 수 있는 프레젠테이션 컨트롤러 적응성 및 사용자 지정 애니메이터 개체"입니다.

샘플 코드를 조금 변경해야 할 수도 있습니다.UIPresentationController init 메서드가 다음으로 변경되었습니다.

initWithPresentedViewController:presented presentingViewController:presenting

그것이 발표되기 전에 그리고 발표되었습니다.교환만 하면 됩니다.

여기 애쉬의 픽스의 오브젝티브 C 버전이 있습니다.

// my attempt at obj-c version of Ash's fix
UIView *theToView = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey].view;
[[[UIApplication sharedApplication] keyWindow] addSubview:theToView];
[transitionContext completeTransition:YES]

제대로 작동하려면 다른 뷰 컨트롤러의 해제 완료 블록에서 새 뷰 컨트롤러를 표시하기 위해 뷰를 다시 추가한 후 주문을 교환하고 [transitionContext completeTransition:] 메서드를 호출해야 했습니다.

이것이 모두를 위해 그것을 고칠 수 있을지는 모르겠지만 내 앱에서는 작동합니다.건배!

Obj-C에 대해서는 이것이 잘 작동한다는 것을 알았습니다.

    [transitionContext completeTransition:YES];
    if(![[UIApplication sharedApplication].keyWindow.subviews containsObject:toViewController.view]) {
        [[UIApplication sharedApplication].keyWindow addSubview:toViewController.view];
    }

ios7과 ios8 모두에서 잘 작동하는 것 같습니다.

나는 그것을 발견했습니다.viewForKey:UITransitionContextToViewKeyios8에서 0을 반환합니다.0인 경우 'To' 보기 컨트롤러에서 보기를 가져옵니다.

이렇게것.completeTransition:YES이 호출됩니다.그래서 만약에viewForKey:UITransitionContextToViewKey합니다. 0을 합니다.toVC.view그리고 0이 반환되었다는 사실을 추적하고 완료 후 컨테이너의 초기 수퍼뷰(창)로 이동합니다.

그래서 이 코드는 iOS7 뿐만 아니라 iOS8에서도 작동하며, 그들이 그것을 고치든 말든 iOS9에서도 작동해야 합니다.

- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext {
    // Get the 'from' and 'to' views/controllers.
    UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    BOOL hasViewForKey = [transitionContext respondsToSelector:@selector(viewForKey:)]; // viewForKey is iOS8+.
    UIView *fromView = hasViewForKey ?
        [transitionContext viewForKey:UITransitionContextFromViewKey] :
        fromVC.view;
    UIView *toView = hasViewForKey ?
        [transitionContext viewForKey:UITransitionContextToViewKey] :
        toVC.view;

    // iOS8 has a bug where viewForKey:to is nil: http://stackoverflow.com/a/24589312/59198
    // The workaround is: A) get the 'toView' from 'toVC'; B) manually add the 'toView' to the container's
    // superview (eg the root window) after the completeTransition call.
    BOOL toViewNilBug = !toView;
    if (!toView) { // Workaround by getting it from the view.
        toView = toVC.view;
    }
    UIView *container = [transitionContext containerView];
    UIView *containerSuper = container.superview; // Used for the iOS8 bug workaround.

    // Perform the transition.
    toView.frame = container.bounds;
    [container insertSubview:toView belowSubview:fromView];
    [UIView animateWithDuration:kDuration delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{
        fromView.frame = CGRectOffset(container.bounds, 0, CGRectGetHeight(container.bounds));
    } completion:^(BOOL finished) {
        [transitionContext completeTransition:YES];

        if (toViewNilBug) {
            [containerSuper addSubview:toView];
        }
    }];
}

는 이 ( 더 것들했습니다.modalPresentationStyle = UIModalPresentationFullScreen물론 사용자 지정 전환 애니메이션을 계속 받을 수 있습니다.

저도 이 문제에 휘말렸습니다.반투명 배경을 사용하여 사용자 지정 전환을 만들고자 했습니다. 여기서 사용자 지정 전환 작업을 수행할 때 사용하는 뷰 컨트롤러는 여전히 볼 수 있지만 배경은 검은색입니다.이 스레드에서 Mark Aron의 답변이 도움이 되었으나 목표 C로 작성되어 있으므로 iOS 9 및 iOS 10에서 테스트한 답변의 Swift 3 버전이 여기 있습니다.

  1. UIPresentationController의 하위 클래스를 만듭니다.다음과 같이 Should Remove PresentersView를 false로 재정의합니다.

    class ModalPresentationController: UIPresentationController {
    
    override var shouldRemovePresentersView: Bool {
    return false
    }
    
    override func containerViewWillLayoutSubviews() {
    presentedView?.frame = frameOfPresentedViewInContainerView
    }
    }
    
  2. 새 뷰 컨트롤러를 인스턴스화하고 전환 대리자를 설정하는 위치에서 다음과 같이 사용자 정의 모달 프리젠테이션 스타일을 표시하도록 지정합니다.

    let newVC = mainStoryboard.instantiateViewController(withIdentifier: "newVC") as! NewViewController 
    
    newVC.transitioningDelegate = self
    
    newVC.modalPresentationStyle = UIModalPresentationStyle.custom
    
    newVC.modalPresentationCapturesStatusBarAppearance = true //optional
    
    present(newVC, animated: true, completion: nil)
    
  3. 이제 UIViewController TransitioningDelicate의 presentationController 메서드를 재정의하고 사용자 지정 UIPresentationController를 반환합니다.저는 현재 수업의 연장선상에 제 것을 가지고 있었습니다.

    extension CurrentViewController: UIViewControllerTransitioningDelegate {
    
    //this is where you implement animationController(forPresented) and animationController(forDismissed) methods
    
    func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController? {
    
    return ModalPresentationController(presentedViewController: presented, presenting: source)
    
    }
    }
    

한 가지 더 주의할 점은 현재 Animator 클래스에서 View에서 를 참조하려고 하면 안 된다는 것입니다.이 값은 0이 되며 런타임에 오류가 발생합니다.그 외에도, 만약 당신이 이런 것들을 구현한다면, 당신은 애니메이션과 함께 당신의 맞춤형 전환을 얻을 것이고, 당신이 그것을 만들면 반투명 배경을 얻을 것입니다.

이 문제를 접한 후, 저는 매우 혼란스러웠습니다. 왜냐하면 저는 얼마 전에 거의 동일한 것을 썼기 때문입니다. 잘 작동했습니다.꽤나 진부해 보이는 수정을 찾기 위해 답을 찾으러 왔는데, 근본 원인을 이해하지 못하는 것 같습니다.그것은 사실 매우 쉽게 고칠 수 있습니다.

일부 답변은 변경을 언급합니다.modalPresentationStyle.overFullScreen 맞니다..overCurrentContext효과가 있을 것입니다.이것은 예상된 것이고, 애플 문서의 행동입니다.하지만 왜 이것은 모두에게 효과가 없을까요?왜 이런 해괴한 코드들과 다른 것들의 조합, 그리고 당신이 해서는 안 되는 미친 것들을 하는 것입니까?

보기가 로드되기 전에 프레젠테이션 스타일을 설정해야 합니다.그 이후로는 안 됩니다.보기가 로드되기 전이라면 init에서 수행하거나 이전 컨트롤러에서 수행하거나 원하는 방식으로 수행합니다.

새로운 UIModal PresentationOverCurrentContext를 사용하여 수정했습니다.iOS 7에서 제가 원래 전환한 것은 모달 아래의 뷰 배경을 흐릿하게 만드는 것이었습니다.

좋아요, 여러분, iOS 13 이상에서 앱을 구축하면 '일하는 애니메이터'가 제대로 작동하지 않는 사례가 하나 있다고 생각합니다.

Env Xcode 11.1, iOS 13.1

문제

제가 하고 싶은 것은 매우 간단합니다.수집 보기가 있습니다. 셀을 누르면 상세 보기로 전환됩니다.'현재 모달리'라는 지루한 기본 스타일을 사용하는 대신 좀 더 재미있게 만들고 싶어서 뷰 컨트롤러 전환을 위한 애니메이터를 작성했습니다.

컬렉션 VC에서 세부 VC로 드래그 앤 드롭하여 IB에 segue를 설정했습니다.segue의 스타일은 'Present modally'이고, 프레젠테이션은 'Full Screen'으로 설정되어 있습니다.

세부 보기가 표시되면 모든 것이 예상대로 작동합니다.그러나 상세 뷰를 해제하고 컬렉션 뷰로 돌아가면 애니메이션 상세 뷰만 보이고 컬렉션 뷰는 사라집니다.여기 저기 찔러봤는데 몇 가지 발견 사항이 있습니다.

1. 함수 'animateTransition()'에서 다음 행을 호출한 직후 수집 보기가 다시 시작되고 표시됩니다.

transitionContext.completeTransition(true)

2.상세 뷰가 컬렉션 뷰를 완전히 덮지 않는 한, 상세 뷰에서 다시 탐색할 때 컬렉션 뷰가 사라지지 않습니다.

해결책

솔직히, 저는 애니메이션 전환이 어떻게 작동하는지에 대해 거의 알지 못합니다.그래서 저는 이 게시물과 다른 게시물만 팔로우 할 수 있고, 각각의 답을 시도해 볼 수 있습니다.불행하게도, 그들 중 누구도 저를 위해 일하지 않습니다.마지막으로, 제가 조정할 수 있는 유일한 것은 IB의 segue 프레젠테이션 스타일입니다(처음부터 했어야 했습니다).제가 발표를 '전체 화면 초과'로 설정하면 기적이 일어나고 저의 문제가 해결됩니다.세부 보기는 애니메이션과 함께 전체 화면으로 표시될 수 있으며, 제거되면 컬렉션 보기를 배경 및 애니메이션 세부 보기로 모두 볼 수 있습니다.

그리고 그 길을 따라 한 번 더 발견된 것은

3. 'ToView' 및 'fromView'를 참조하기 위해 다음 방법이 모두 사용됩니다.

간접적인 방법:

transitionContext.viewController(forKey: .to)?.view
transitionContext.viewController(forKey: .from)?.view

직접적인 방법:

transitionContext.view(forKey: .to)
transitionContext.view(forKey: .from)

하지만 제가 segue 스타일을 '전체 화면 초과'로 전환했을 때, 'toView'와 'fromView' 모두에 대해 'nil'을 직접 반환하고 간접적으로만 작동하는 방식으로 전환했을 때, 이 문제는 다른 게시물에서도 언급되었으니, 저의 작은 발견을 여기에 게시할 가치가 있다고 생각합니다.

이것이 미래에 누군가에게 도움이 되기를 바랍니다.

컨텐츠 보기 컨트롤러를 해제할 때도 같은 문제가 발생했습니다.

내 앱에는 하위 보기 컨트롤러(VC 표시)를 모듈식으로 보여주는 이 상위 보기 컨트롤러가 있습니다.그런 다음 하위 VC의 하위 뷰를 누르면 다른 VC가 표시됩니다(콘텐츠 뷰 컨트롤러(표시된 VC)라고 부릅니다).

문제는 컨텐츠 VC(현재 제시 VC)를 해제할 때 하위 VC(현재 제시 VC)로 이동해야 하지만 사용자 지정 전환이 완료되는 즉시 하위 VC가 갑자기 사라지고 상위 VC가 표시된다는 것입니다.

이 문제를 해결하기 위해 제가 한 일은

  1. .modalPresentationStyle인 "vc"에서 ""로 중 입니다..automatic.fullscreen.
  2. 그리고 나서 변경했습니다..modalPresentationStyle.VC에서 VC로.fullscreen뿐만 아니라.

부모자녀 (사용할 때 사용할 때는 VC가 표시됩니다..overCurrentContext또는 자동)이 iOS 13의 새로운 기능입니다.

어린이용 카드식 시트를 보관할 수 있는 솔루션이 있는지 알고 싶습니다.상위에서 제공하는 경우 VC.

뷰 컨트롤러를 다른 뷰 컨트롤러의 하위로 추가합니다.

[self addChildViewController:childViewController];                 

확인하고 저에게 알려주세요.

언급URL : https://stackoverflow.com/questions/24338700/from-view-controller-disappears-using-uiviewcontrollercontexttransitioning

반응형