参考:
ios-swipe-left-right-between-tabs-possible
iphone-how-to-switch-tabs-with-an-animation
说明
在使用UITabBarController进行视图管理时,一般很少使用滑动手势来进行视图切换,因为有的视图可能会有table视图,需要对table进行手势管理,以防重复。
实现
每个Tabbar ViewController都要添加如下代码,建议在基类中添加:
ViewDidLoad
UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizeralloc] initWithTarget:self action:@selector(tappedRightButton:)];
[swipeLeft setDirection:UISwipeGestureRecognizerDirectionLeft];
[self.view addGestureRecognizer:swipeLeft];
UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:selfaction:@selector(tappedLeftButton:)];
[swipeRight setDirection:UISwipeGestureRecognizerDirectionRight];
[self.view addGestureRecognizer:swipeRight];
再添加2个函数,包含切换动画效果:
- (IBAction) tappedRightButton:(id)sender
{
NSUInteger selectedIndex = [self.tabBarController selectedIndex];
NSArray *aryViewController = self.tabBarController.viewControllers;
if (selectedIndex < aryViewController.count - 1) {
UIView *fromView = [self.tabBarController.selectedViewControllerview];
UIView *toView = [[self.tabBarController.viewControllersobjectAtIndex:selectedIndex + 1] view];
[UIView transitionFromView:fromView toView:toView duration:0.5foptions:UIViewAnimationOptionTransitionFlipFromRightcompletion:^(BOOL finished) {
if (finished) {
[self.tabBarController setSelectedIndex:selectedIndex + 1];
}
}];
}
}
- (IBAction) tappedLeftButton:(id)sender
{
NSUInteger selectedIndex = [self.tabBarController selectedIndex];
if (selectedIndex > 0) {
UIView *fromView = [self.tabBarController.selectedViewControllerview];
UIView *toView = [[self.tabBarController.viewControllersobjectAtIndex:selectedIndex - 1] view];
[UIView transitionFromView:fromView toView:toView duration:0.5foptions:UIViewAnimationOptionTransitionFlipFromLeftcompletion:^(BOOL finished) {
if (finished) {
[self.tabBarController setSelectedIndex:selectedIndex - 1];
}
}];
}
}
第2种方式实现视图切换方法
- (void)swipeRightView{
//滑出右边视图
NSUInteger selectedIndex = [self.tabBarController selectedIndex];
[self.tabBarController setSelectedIndex:selectedIndex + 1];
//To animate use this code
CATransition *anim = [CATransition animation];
[anim setType:kCATransitionPush];
[anim setSubtype:kCATransitionFromRight];
[anim setDuration:1];
[anim setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]];
[self.view.window.layer addAnimation:anim forKey:@"fadeTransition"];
}
- 第三种方法实现右边视图滑入
- (void) tappedThridRightButton{
NSUInteger selectedIndex = [self.tabBarController selectedIndex];
// Get the views.
UIView * fromView = self.tabBarController.selectedViewController.view;
UIView * toView = [[self.tabBarController.viewControllers objectAtIndex:selectedIndex + 1] view];
// Get the size of the view area.
CGRect viewSize = fromView.frame;
// Add the to view to the tab bar view.
[fromView.superview addSubview:toView];
// Position it off screen.
toView.frame = CGRectMake(fromView.frame.size.width, viewSize.origin.y, fromView.frame.size.width, viewSize.size.height);
[UIView animateWithDuration:0.3
animations: ^{
// Animate the views on and off the screen. This will appear to slide.
fromView.frame =CGRectMake(-viewSize.size.width, viewSize.origin.y, viewSize.size.width, viewSize.size.height);
toView.frame =CGRectMake(0, viewSize.origin.y, viewSize.size.width, viewSize.size.height);
}
completion:^(BOOL finished) {
if (finished) {
// Remove the old view from the tabbar view.
[fromView removeFromSuperview];
[self.tabBarController setSelectedIndex:selectedIndex + 1];
}
}];
}