2016 년 4 월 업데이트 : Justed는 모든 투표에 대해 모든 사람에게 감사를 표하기 위해이 내용을 업데이트하고 싶었습니다. 또한 이것은 원래 ARC 이전, 제약 이전, 이전 ... 많은 것들로 돌아가서 작성되었습니다! 따라서 이러한 기술을 사용할지 여부를 결정할 때이 점을 고려하십시오. 더 현대적인 접근 방식이있을 수 있습니다. 아, 그리고 찾으면. 모든 사람이 볼 수 있도록 응답을 추가하세요. 감사.
얼마 후 ...
많은 연구 끝에 두 가지 작업 솔루션을 찾았습니다. 둘 다 작동하고 탭 사이의 애니메이션을 수행했습니다.
솔루션 1 :보기에서 전환 (단순)
이것은 가장 쉽고 미리 정의 된 UIView 전환 방법을 사용합니다. 이 솔루션을 사용하면 방법이 우리를 위해 일하기 때문에 뷰를 관리 할 필요가 없습니다.
// Get views. controllerIndex is passed in as the controller we want to go to.
UIView * fromView = tabBarController.selectedViewController.view;
UIView * toView = [[tabBarController.viewControllers objectAtIndex:controllerIndex] view];
// Transition using a page curl.
[UIView transitionFromView:fromView
toView:toView
duration:0.5
options:(controllerIndex > tabBarController.selectedIndex ? UIViewAnimationOptionTransitionCurlUp : UIViewAnimationOptionTransitionCurlDown)
completion:^(BOOL finished) {
if (finished) {
tabBarController.selectedIndex = controllerIndex;
}
}];
해결 방법 2 : 스크롤 (더 복잡함)
더 복잡한 솔루션이지만 애니메이션을 더 많이 제어 할 수 있습니다. 이 예에서는 슬라이드를 켜고 끌 수있는 뷰를 얻습니다. 이것으로 우리는 뷰를 직접 관리해야합니다.
// Get the views.
UIView * fromView = tabBarController.selectedViewController.view;
UIView * toView = [[tabBarController.viewControllers objectAtIndex:controllerIndex] view];
// Get the size of the view area.
CGRect viewSize = fromView.frame;
BOOL scrollRight = controllerIndex > tabBarController.selectedIndex;
// Add the to view to the tab bar view.
[fromView.superview addSubview:toView];
// Position it off screen.
toView.frame = CGRectMake((scrollRight ? 320 : -320), viewSize.origin.y, 320, viewSize.size.height);
[UIView animateWithDuration:0.3
animations: ^{
// Animate the views on and off the screen. This will appear to slide.
fromView.frame =CGRectMake((scrollRight ? -320 : 320), viewSize.origin.y, 320, viewSize.size.height);
toView.frame =CGRectMake(0, viewSize.origin.y, 320, viewSize.size.height);
}
completion:^(BOOL finished) {
if (finished) {
// Remove the old view from the tabbar view.
[fromView removeFromSuperview];
tabBarController.selectedIndex = controllerIndex;
}
}];
Swift의이 솔루션 :
extension TabViewController: UITabBarControllerDelegate {
public func tabBarController(tabBarController: UITabBarController, shouldSelectViewController viewController: UIViewController) -> Bool {
let fromView: UIView = tabBarController.selectedViewController!.view
let toView : UIView = viewController.view
if fromView == toView {
return false
}
UIView.transitionFromView(fromView, toView: toView, duration: 0.3, options: UIViewAnimationOptions.TransitionCrossDissolve) { (finished:Bool) in
}
return true
}
}