Cập nhật 04/2016: Justed muốn cập nhật điều này để nói lời cảm ơn đến mọi người vì tất cả các phiếu bầu. Cũng xin lưu ý rằng điều này ban đầu được viết từ khi ... trước ARC, trước các ràng buộc, trước ... rất nhiều thứ! Vì vậy, hãy tính đến điều này khi quyết định có sử dụng các kỹ thuật này hay không. Có thể có nhiều cách tiếp cận hiện đại hơn. Ồ, và nếu bạn tìm thấy. Vui lòng thêm câu trả lời để mọi người có thể xem. Cảm ơn.
Một thời gian sau ...
Sau nhiều nghiên cứu, tôi đã đưa ra hai giải pháp hiệu quả. Cả hai điều này đều hoạt động và tạo hoạt ảnh giữa các tab.
Giải pháp 1: chuyển đổi từ chế độ xem (đơn giản)
Đây là cách dễ nhất và sử dụng phương pháp chuyển tiếp UIView được xác định trước. Với giải pháp này, chúng ta không cần phải quản lý các lượt xem vì phương thức này sẽ làm việc cho chúng ta.
// 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;
}
}];
Giải pháp 2: cuộn (phức tạp hơn)
Một giải pháp phức tạp hơn, nhưng cung cấp cho bạn nhiều quyền kiểm soát hoạt ảnh hơn. Trong ví dụ này, chúng ta có các chế độ xem để trượt và tắt. Với cái này, chúng ta cần tự quản lý các lượt xem.
// 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;
}
}];
Giải pháp này trong 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
}
}