2010-12-19 53 views
0

我想從側面呈現UIViewController。 現在的Modal可以做的唯一事情就是Verticle Slide in。從側面呈現UIViewController

任何機構對此有什麼想法?

讓我知道」感謝

+0

你真的應該接受一些答案! 0%的接受率是非常糟糕的,它會阻止人們幫助你。 – JustSid 2010-12-19 20:54:00

+0

真的,我感覺節日,但:D – 2010-12-19 21:17:35

+0

不知道你的意思只是' – Franky 2010-12-21 01:50:23

回答

2

要成爲肛門關於MVC,它真的是查看你的移動而不是控制器。

我會建議這樣做的方式是使用導航控制器,它的動畫是默認的水平幻燈片,您可以免費獲得導航堆棧 - 這意味着您有後退按鈕自動生成,標題和按鈕屬性,你可以設置,雖然這些可以很容易隱藏是理想的。

使用導航控制器:

創建您的父母控制器,塞斯,分配一個UINavigationsController財產,並適當初始化它。然後,您可以按照您想要的任何順序加載控制器,並在導航後查看。

Here是NavControllers(通常他們是使用UITableViewControllers但不必是)

鵬的例子是動畫,我要指出,它消除了父視圖一個很好的教程(並根據您的設計可能不會只是刪除'currentView' - 因爲你的/一個頂視圖可能是一個子視圖),所以如果你導航回你將不得不自己處理這個。

+1

呃...你是關於MVC模式的肛門嗎? – JustSid 2010-12-19 21:16:28

+1

只是提出一點,你不從側面呈現'控制器'' – 2010-12-19 21:18:47

2

我這樣做,它的工作,雖然我不知道是否有一個更正式的方式做到這一點(UIVIewAimationTransition沒有一個幻燈片選項):

UIView *currentView = self.view; 
UIView *theWindow = [currentView superview]; 

[currentView removeFromSuperview]; 

CATransition *animation = [CATransition animation]; 
[animation setDuration:0.5]; 
[animation setType:kCATransitionPush]; 
[animation setSubtype:kCATransitionFromLeft]; 
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]]; 

[[theWindow layer] addAnimation:animation forKey:@"SwitchToView1"]; 
+0

這真棒! – Franky 2010-12-20 23:48:27

+0

說我想刪除視圖,並使其看起來像它從右邊回來。我會改變子類型嗎? – Franky 2010-12-20 23:48:55

+0

是的,子類型將改變動畫的方向。 – 2010-12-21 15:28:46

0

我剛剛給出了另一個非常相似的SO問題的答案,但在這裏它再次,以防人們在這裏查找最終結果。

所有在我的應用程序的ViewControllers從MyViewController繼承它,此外還有一些其他的默認行爲,有此屬性:

@property(readwrite, nonatomic) BOOL slideFromSide; 

而這種代碼:

- (void) presentViewController: (UIViewController*) vc animated: (BOOL) flag completion: (void (^)(void)) completion 
{ 
    BOOL slideIn = NO; 
    if ([vc isKindOfClass: [MyViewController class]]) 
    { 
     MyViewController *svc = (MyViewController*) vc; 
     slideIn = svc.slideFromSide; 
    } 

    if (slideIn) 
    { 
     [self addChildViewController: vc]; 
     [self.view addSubview: vc.view]; 

     CGRect frame = vc.view.frame; 
     frame.origin.x = frame.size.width; 
     vc.view.frame = frame; 

     frame.origin.x = 0; 
     [UIView animateWithDuration: 0.33 
         animations: ^{ 
          vc.view.frame = frame; 
         } 
     ]; 
    } 
    else 
    { 
     [super presentViewController: vc animated: flag completion: completion]; 
    } 
} 


- (IBAction) backAction: (id) sender 
{ 
    if (_slideFromSide) 
    { 
     CGRect frame = self.view.frame; 
     frame.origin.x = frame.size.width; 
     [UIView animateWithDuration: 0.33 
         animations: ^{ 
          self.view.frame = frame; 
         } 
         completion:^(BOOL finished) { 
          [self removeFromParentViewController]; 
         } 
     ]; 
    } 
    else 
    { 
     [self dismissViewControllerAnimated: YES completion: nil]; 
    } 
} 

然後,在ViewControllers我想滑入,我有:

- (id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName: nibNameOrNil bundle: nibBundleOrNil]; 
    if (self) 
    { 
     self.slideFromSide = YES; 
     // Whatever else you want to do 
    } 

    return self; 
} 

調用一個新的ViewController就像正常:

WhateverViewController *vc = [WhateverViewController alloc] initWithNibName: nil bundle: nil]; 
[self presentViewController: vc animated: YES completion: nil];