Güncelleme 04/2016: Justed, tüm oylar için herkese teşekkür etmek için bunu güncellemek istedi. Lütfen bunun orijinal olarak ... ARC'den önce, kısıtlamalardan önce, daha önce ... birçok şeyden önce yazıldığına dikkat edin! Bu tekniklerin kullanılıp kullanılmayacağına karar verirken lütfen bunu dikkate alın. Daha modern yaklaşımlar olabilir. Oh, bir tane bulursan. Lütfen herkesin görebilmesi için bir yanıt ekleyin. Teşekkürler.
Bir süre sonra ...
Çok fazla araştırmadan sonra iki çalışma çözümü buldum. Bunların ikisi de çalıştı ve sekmeler arasındaki animasyonu yaptı.
1.Çözüm: Görünümden geçiş (basit)
Bu en kolayıdır ve önceden tanımlanmış bir UIView geçiş yöntemini kullanır. Bu çözümle görünümleri yönetmemize gerek yok çünkü yöntem bizim için çalışıyor.
// 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.Çözüm: Kaydırma (daha karmaşık)
Daha karmaşık bir çözüm, ancak size animasyon üzerinde daha fazla kontrol sağlar. Bu örnekte, görünümlerin kayarak açılıp kapanmasını sağlıyoruz. Bununla görüşleri kendimiz yönetmemiz gerekiyor.
// 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'deki Bu Çözüm:
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
}
}