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
})
}
'program tip' 카테고리의 다른 글
null의 'innerHTML'속성을 설정할 수 없습니다. (0) | 2020.11.16 |
---|---|
.vsix Visual Studio Extensions를 제거하는 방법은 무엇입니까? (0) | 2020.11.16 |
Subversion 저장소를 다른 서버로 이동 (0) | 2020.11.15 |
/ bin / true는 무엇입니까 (0) | 2020.11.15 |
ggplot2 테마 옵션 목록? (0) | 2020.11.15 |