program tip

iOS 8-사용자 지정 프레젠테이션으로 뷰 컨트롤러를 닫은 후 화면이 비어 있음

radiobox 2020. 11. 16. 08:03
반응형

iOS 8-사용자 지정 프레젠테이션으로 뷰 컨트롤러를 닫은 후 화면이 비어 있음


를 사용하여 다양한 뷰 컨트롤러를 닫을 때 UIModalPresentationCustom모든 뷰 컨트롤러가 뷰 계층에서 제거 된 것처럼 뷰 컨트롤러가 해제 된 후 화면이 검은 색으로 바뀝니다.

전환 대리자가 올바르게 설정되고 animationControllerForPresentedController가 올바르게 요청되고 전달되며 애니메이션이 끝나면 전환이 완료됩니다.

이 정확한 코드는 iOS 7 SDK로 컴파일 할 때 완벽하게 작동하지만 iOS 8b5로 컴파일하면 손상됩니다.


두 가지 모두를 추가 할 가능성이 높기 때문입니다.

[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]

그리고 제시된

[transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]

애니메이션 컨트롤러의 (void) animateTransition : (id) transitionContext 메서드에서 containerView에 컨트롤러를 봅니다. 사용자 정의 모달 프리젠 테이션을 사용하고 있기 때문에, 제시 뷰 컨트롤러는 여전히 아래에 표시됩니다 되게 뷰 컨트롤러 . 이제 여전히 표시되므로 컨테이너보기에 추가 할 필요가 없습니다. 대신 제시된 뷰 컨트롤러 만 containerView에 추가하십시오 . animateTransition : 메서드 내부에서 다음과 같이 보일 것입니다.

UIView *containerView = [transitionContext containerView];
UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

// Boolean value to determine presentation or dismissal animation
if (self.presenting){        
    [transitionContext.containerView addSubview:toViewController.view];
    // Your presenting animation code
} else {
    // Your dismissal animation code
}

이것은 높은 투표와 수락 된 대답이 사람들을 오도하는 종류의 질문입니다. 긴 단어는 짧습니다.

첫째 , UIModalPresentationCustom을 사용하지 마십시오. ( 상세 )

둘째 , animateTransition의 뷰에서 /로 검색하는 새로운 방법이 있으며 더 이상 'fromVC.view'와 같은 것을 사용하지 마십시오. ( )

UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
UIView *fromView = [transitionContext viewForKey:UITransitionContextFromViewKey];
UIView *toView = [transitionContext viewForKey:UITransitionContextToViewKey];

//swift
let fromVC = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)
let toVC = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)
let fromView = transitionContext.viewForKey(UITransitionContextFromViewKey)
let toView = transitionContext.viewForKey(UITransitionContextToViewKey)

이제 검은 화면이 사라집니다.


동일한 문제가 발생한 것 같습니다. Xcode 6 beta5를 사용하고 있습니다.

Google에서 검색 한 결과 다른 사람이 이와 동일한 문제가있는 것을 발견했으며 iOS 8의 심각한 버그라고 말 했으므로 Apple에서 곧이 문제를 해결할 수 있기를 바랍니다.

https://github.com/TeehanLax/UIViewController-Transitions-Example/issues/5


전환 완료 블록에 아래 코드를 추가하여 수정했습니다.

[UIView animateWithDuration:[self transitionDuration:transitionContext] animations: ^{
    // Animation code

 } completion: ^(BOOL finished) {
     // More of your code

     // Add the following line before completing the transition
    [[[UIApplication sharedApplication] keyWindow] sendSubviewToBack:toViewController.view];

    // Complete the transition
    [transitionContext completeTransition:YES];
}];

아마도 뷰 계층 구조가 새로운 Xcode에서 버그가 있거나 iOS8과 약간 다를 수 있습니다. 이 코드는 저에게 효과적이었습니다. animateTransition : transitionContext 메서드에서 컨트롤러를 닫으면서 추가합니다.

[[UIApplication sharedApplication].keyWindow addSubview:toViewController.view];
toViewController.view.userInteractionEnabled = YES;

Quick Tip: Make sure your "From" UIViewController is what you're expecting.

    NSLog(@" FROM vc %@" , [[transitionContext  viewControllerForKey:UITransitionContextFromViewControllerKey] description]);

Had a similar bug in my code in the past. You can easily pull out the right "From" VC context.

  UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];  
  fromView =  [[[fromVC childViewControllers] firstObject]  view];

I had the same problem, and what caused the problem for me is that I wasn't setting the toViewController's final frame. See the following example from http://www.appcoda.com/custom-view-controller-transitions-tutorial/

func animateTransition(transitionContext: UIViewControllerContextTransitioning) {

    let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)!
    let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)!
    let finalFrameForVC = transitionContext.finalFrameForViewController(toViewController)
    let containerView = transitionContext.containerView()
    let bounds = UIScreen.mainScreen().bounds
    toViewController.view.frame = CGRectOffset(finalFrameForVC, 0, bounds.size.height)
    containerView.addSubview(toViewController.view)

    UIView.animateWithDuration(transitionDuration(transitionContext), delay: 0.0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.0, options: .CurveLinear, animations: {
        fromViewController.view.alpha = 0.5
        toViewController.view.frame = finalFrameForVC
    }, completion: {
        finished in
        transitionContext.completeTransition(true)
        fromViewController.view.alpha = 1.0
    })
} 

참고URL : https://stackoverflow.com/questions/25588617/ios-8-screen-blank-after-dismissing-view-controller-with-custom-presentation

반응형