Update 04/2016: 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
}
}