ChildViewSampleViewController.h
@interface ChildViewSampleViewController : UIViewController
@end
ChildViewSampleViewController.m
@interface ChildViewSampleViewController ()
@property (nonatomic) UIViewController *root;
@property (nonatomic) UIViewController *overlap;
@property (nonatomic) UIButton *button;
@end
@implementation ChildViewSampleViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
self.root = [[UIViewController alloc] init];
self.root.view.frame = CGRectMake(0, 60, 320, self.view.frame.size.height - 60);
[self.root.view setBackgroundColor:[UIColor yellowColor]];
[self addChildViewController:self.root];
[self.root didMoveToParentViewController:self];
[self.view addSubview:self.root.view];
self.button = [[UIButton alloc] initWithFrame:CGRectMake(10, 10, 150, 50)];
[self.button setTitle:@"Show" forState:UIControlStateNormal];
[self.button addTarget:self action:@selector(pop:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:self.button];
}
#pragma mark - Event
-(void)pop:(id)sender {
if (self.overlap == nil ) {
// Open(Show)
self.overlap = [[UIViewController alloc] init];
[self.overlap.view setBackgroundColor:[UIColor redColor]];
[self addChildViewController:self.overlap];
// Start line
CGRect startFrame = self.view.frame;
startFrame.origin.y = startFrame.size.height;
self.overlap.view.frame = startFrame;
// Move half
[self transitionFromViewController:self.root
toViewController:self.overlap
duration:1.0
options:0
animations:^{
CGRect original = self.root.view.frame;
self.overlap.view.frame = CGRectMake(0, original.origin.y, original.size.width, original.size.height);
}
completion:^(BOOL finished) {
[self.overlap didMoveToParentViewController:self];
[self.button setTitle:@"Hide" forState:UIControlStateNormal];
}];
}
else {
// Hide
[self.overlap willMoveToParentViewController:nil];
// Good-bye
[self transitionFromViewController:self.overlap
toViewController:self.root
duration:1.0
options:0
animations:^{
CGRect original = self.root.view.frame;
self.overlap.view.frame = CGRectMake(0, original.size.height, original.size.width, original.size.height);
[self.overlap.view.superview bringSubviewToFront:self.overlap.view];
}
completion:^(BOOL finished) {
[self.overlap removeFromParentViewController];
self.overlap = nil;
[self.button setTitle:@"Show" forState:UIControlStateNormal];
}];
}
}
@end
ps:
http://www.jianshu.com/p/91e0d6554254
http://www.jianshu.com/p/032e4bbcf822