views:

859

answers:

2

I Am creating an application and i want to achieve push effect but without using navigation controller.Does someone knows a core animation source code to achieve this? I have a view hierarchy like this.A main controller which has an header image with 4 buttons on it.I mean it will be displayed all the time whatever view in front of screen is.So i use add subview methods.Now in some view i want to navigate further when cliking on table view cell but unabvle to figure out how to achieve that navigation animation?

here is the code to adding subviews....

-(IBAction)ShowDashBoardContentView
{
if(ButtonDashBoard.selected==YES)
    [ButtonDashBoard setSelected:YES];
else
{
    [ButtonDashBoard setSelected:YES];
    [ButtonFreebies setSelected:NO];
    [self.FreebiesViewMainObject.view removeFromSuperview];
    [ButtonConnect setSelected:NO];
    [self.ConnectContentViewObject.view removeFromSuperview];
    [ButtonDeals setSelected:NO];
    [self.DealsViewMainObject.view removeFromSuperview];
}
if(DashBoardContentView==nil)
{
    DashBoardContent *vController =[[DashBoardContent alloc] initWithNibName:@"DashBoardContent" bundle:[NSBundle mainBundle]];
    vController.view.frame=CGRectMake(0, 90, 320, 370);
    self.DashBoardContentView=vController;
    [vController release];
}
[self.DashBoardContentView viewWillAppear:YES];
[self.view addSubview:[self.DashBoardContentView view]];
[self BringSubviewsToFront];
}

-(IBAction)ShowConnectContentView
{
if(ButtonConnect.selected==YES)
    [ButtonConnect setSelected:YES];
else
{
    [ButtonConnect setSelected:YES];
    [ButtonFreebies setSelected:NO];
    [self.FreebiesViewMainObject.view removeFromSuperview];
    [ButtonDashBoard setSelected:NO];
    [self.DashBoardContentView.view removeFromSuperview];
    [ButtonDeals setSelected:NO];
    [self.DealsViewMainObject.view removeFromSuperview];
}
if(ConnectContentViewObject==nil)
{
    ConnectContentView *vController =[[ConnectContentView alloc] initWithNibName:@"ConnectContentView" bundle:[NSBundle mainBundle]];
    vController.view.frame=CGRectMake(0, 90, 320, 370);
    self.ConnectContentViewObject=vController;
    [vController release];
}
[self.ConnectContentViewObject viewWillAppear:YES];
[self.view addSubview:[self.ConnectContentViewObject view]];
[self BringSubviewsToFront];
}

-(IBAction)ShowDealsView
{
if(ButtonDeals.selected==YES)
    [ButtonDeals setSelected:YES];
else
{
    [ButtonDeals setSelected:YES];
    [ButtonFreebies setSelected:NO];
    [self.FreebiesViewMainObject.view removeFromSuperview];
    [ButtonDashBoard setSelected:NO];
    [self.DashBoardContentView.view removeFromSuperview];
    [ButtonConnect setSelected:NO];
    [self.ConnectContentViewObject.view removeFromSuperview];
}

if(DealsViewMainObject==nil)
{
    DealsViewMain *vController =[[DealsViewMain alloc] initWithNibName:@"DealsViewMain" bundle:[NSBundle mainBundle]];
    vController.view.frame=CGRectMake(0, 90, 320, 370);
    self.DealsViewMainObject=vController;
    [vController release];
}
[self.DealsViewMainObject viewWillAppear:YES];
[self.view addSubview:[self.DealsViewMainObject view]];
[self BringSubviewsToFront];
}

-(IBAction)ShowFreebiesView
{
if(ButtonFreebies.selected==YES)
    [ButtonFreebies setSelected:YES];
else
{
    [ButtonFreebies setSelected:YES];
    [ButtonDeals setSelected:NO];
    [self.DealsViewMainObject.view removeFromSuperview];
    [ButtonDashBoard setSelected:NO];
    [self.DashBoardContentView.view removeFromSuperview];
    [ButtonConnect setSelected:NO];
    [self.ConnectContentViewObject.view removeFromSuperview];
}
if(FreebiesViewMainObject==nil)
{
    FreebiesViewMain *vController =[[FreebiesViewMain alloc] initWithNibName:@"FreebiesViewMain" bundle:[NSBundle mainBundle]];
    vController.view.frame=CGRectMake(0, 90, 320, 370);
    self.FreebiesViewMainObject=vController;
    [vController release];
}
[self.FreebiesViewMainObject viewWillAppear:YES];
[self.view addSubview:[self.FreebiesViewMainObject view]];
[self BringSubviewsToFront];
}


-(void)BringSubviewsToFront
{
[self.view bringSubviewToFront:HeaderView];
[self.view bringSubviewToFront:ButtonDeals];
[self.view bringSubviewToFront:ButtonDashBoard];
[self.view bringSubviewToFront:ButtonConnect];
[self.view bringSubviewToFront:ButtonFreebies];
}

Now the DealsViewMainObject contains a tableview and i need to navigate further from here.also while removing view from superview how to animate like popviewcontroller animated? BTW thanks for the answer Felixyz.

+2  A: 

You could use a UINavigationController anyway, with its property navigationBarHidden set to YES, and use your custom UIView to call pushViewController:animated: and popViewControllerAnimated: or popToRootViewControllerAnimated: to drive your animations.

If the only thing you want is the slide-in and slide-out animations, I think this would be much easier to write.

Adrian Kosmaczewski
I tried this but it's not working
Rahul Vyas
+1  A: 

You can use a CATransition, along these lines:

// Get index of view to be removed (oldSubView)
NSUInteger index;
for(index = 0; [subViews objectAtIndex:index] != oldSubView; ++index) {}

// Remove old view
[oldSubView removeFromSuperview];

// Inser new view at right index
[self insertSubview:newSubView atIndex:index];

// Create the transition
CATransition *animation = [CATransition animation];
[animation setDelegate:self];
[animation setType:kCATransitionPush];
[animation setSubtype:kCATransitionFromLeft;];
[animation setDuration:0.5f];
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[[self layer] addAnimation:animation forKey:@"pushIn"];

You don't have to tell the transition which views to push, it will do it automatically (since you removed and inserted views).

Have a look at this example code from Apple: how to perform transitions between two views using built-in Core Animation transitions.

EDIT (in response to comments): This code should be used inside a UIView subclass. If you want to use it in a UIViewController subclass, you have to change self to self.view everywhere. You would simply put this code into a separate method with a signature like this:

-(void)replaceView:(UIView*)oldSubView withView:(UIView*)newSubView;

You put that method into your class, and call it whenever you want to replace one view with another. You need to have a reference to these views, obviously.

My best guess is that you should replace this code:

[self.view addSubview:[self.FreebiesViewMainObject view]];
[self BringSubviewsToFront];

with

[self replaceView:self.rootView withView:freebiesViewMainObject.view];

But you have to work on this a bit more to get all the pieces to fit together. Really, looking at some good example code like the one I linked to, and really understanding it, is a lot better then to get a few code snippets off of SO and try to throw them into your code.

Felixyz
what is subviews in your loop?
Rahul Vyas
how do i get oldsubview to remove?
Rahul Vyas
I am posting my code to add subviews.Please tell me in that code where do i put your code?
Rahul Vyas
I updated the answer. As a matter of convention, note that variable names should not start with capital letters. You should use: headerView, buttonDeals, buttonDashBoard, buttonConnect, etc. The same goes for method names: BringSubviewsToFront should be bringSubviewsToFront.
Felixyz