2013-07-21 124 views
8

我想要一個UIViewController,它以右邊的「幻燈片」動畫出現。不像推普塞格,不像Facebook應用程序。我希望新的ViewController滑動當前窗口的頂部(而不是將它推開),但只覆蓋屏幕的一部分,而讓另一部分顯示第一個ViewController。UIViewController半屏「抽屜滑動」動畫

我曾嘗試:我已經得到最接近的是通過以下創建自定義賽格瑞:

- (void)perform 
{ 
    __block UIViewController *src = (UIViewController *) self.sourceViewController; 
    __block UIViewController *dst = (UIViewController *) self.destinationViewController; 

    CATransition* transition = [CATransition animation]; 
    transition.duration = .50; 
    transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
    transition.type = kCATransitionMoveIn; 
    transition.subtype = kCATransitionFromRight; 

    [src.navigationController.view.layer addAnimation:transition forKey:@"SwitchToView1"]; 
    [src.navigationController pushViewController:dst animated:NO]; 
} 

這實現了我要爲動漫,但它涵蓋了整個第一視圖控制器。我該如何讓它在某個時刻停下來,而不是覆蓋整個事物?

我正在使用故事板,我這是我第一次嘗試任何形式的新動畫。

+0

你好,我也需要實現同樣的事情,你能給我一些關於我放置這個代碼的類的初步想法嗎? –

回答

12

你可以嘗試做它在源視圖控制器,並改變幀您destnation(x軸)喜歡的東西:

- (void) perform {  
    UIViewController *dst = (UIViewController *) self.destinationViewController; 

    [dst.view setFrame:CGRectMake(160, 0, YOUR_DST_WIDTH, YOUR_DST_HEIGHT)]; 

    //your animation stuff... 

    [self addChildViewController:dst]; 
    [self.view addSubview:dst.view]; 
    [dst didMoveToParentViewController:self]; 
} 

而且應該這樣做!

讓我知道,如果它沒有...

UPDATE !:

@CaptJak哎,遺憾的是沒有爲你..我寫了下面的代碼工作了,和它的工作原理這裏沒有任何問題..我把它鏈接到一個按鈕點擊..試試吧,讓我知道! (PS:我也添加了動畫!)。

ViewController *tlc = [self.storyboard instantiateViewControllerWithIdentifier:@"MainViewController"]; 
[tlc.view setFrame:CGRectMake(-320, 0, self.view.frame.size.width, self.view.frame.size.height)]; 

[self addChildViewController:tlc]; 
[self.view addSubview:tlc.view]; 
[tlc didMoveToParentViewController:self]; 

[UIView animateWithDuration:0.3 animations:^{ 
    [tlc.view setFrame:CGRectMake(-160, 0, self.view.frame.size.width, self.view.frame.size.height)]; 
}]; 
+0

不,不起作用。我不是以編程方式創建dst VC,如果我放入我的源VC,'self.destinationViewController'不起作用。我上面的代碼來自「UIStoryBoardSegue」子類(因此是源和目標控制器)。做上述也不會給我動畫... – CaptJak

+0

你有什麼建議嗎? – CaptJak

+0

@CaptJak檢查我的新更新! – Albara

5

使用Albara給出的答案,我也可以用相同的動畫創建一個segue。自定義賽格如下:

- (void)perform 
{ 
    UIViewController *src = (UIViewController *)self.sourceViewController; 
    UIViewController *dst = (UIViewController *)self.destinationViewController; 

    [dst.view setFrame:CGRectMake(380, 0, dst.view.frame.size.width, dst.view.frame.size.height)]; 

    [src addChildViewController:dst]; 
    [src.view addSubview:dst.view]; 
    [dst didMoveToParentViewController:src]; 

    [UIView animateWithDuration:0.5 animations:^{ 
     [dst.view setFrame:CGRectMake(300, 0, src.view.frame.size.width, src.view.frame.size.height)]; 
    }]; 

} 

只是一個重命名的問題,真的。

+0

先生,我將如何使用uigesturerecongniton刪除此視圖? –

2

我剛剛創建了NDOverlayViewController來做這樣的事情。實際上,它可以將一個視圖控制器從具有可變偏移量,範圍和動畫選項的任何邊緣疊加/滑動到另一個視圖控制器上我創建了它作爲一個實驗,但也許這對別人有幫助?