2013-07-21 11 views
8

Ich versuche eine UIViewController zu haben, die mit einer "Folie" -Animation von rechts erscheint. Nicht wie ein Push-Segment, nicht wie die Facebook-App. Ich möchte, dass der neue ViewController OBEN von der aktuellen Folie gleitet (nicht wegschiebt), sondern nur TEIL des Bildschirms bedeckt, während der andere Teil den ersten ViewController anzeigt.UIViewController halber Bildschirm "Schublade Folie" Animation

Was ich versucht habe: Die nächste, die ich bekommen habe, ist durch eine benutzerdefinierte segue mit der folgenden erstellen:

- (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]; 
} 

Dadurch wird erreicht, Animation, die ich gehen, aber es deckt die gesamte erste ViewController. Wie würde ich es an einem bestimmten Punkt stoppen und nicht die ganze Sache abdecken?

Ich benutze Storyboards, und ich versuche zum ersten Mal irgendeine neue Animation.

+0

Hallo ich muss auch das gleiche Ding implementieren, kannst du mir bitte eine erste Idee geben, auf welche Klasse ich diesen Code setze? –

Antwort

12

Sie können gerne tun es in Ihrem Source-View-Controller, und das Ändern der Rahmen für Ihr destnation (die x-Achse) etwas versuchen:

- (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]; 
} 

Und das sollte es tun!

Lassen Sie mich wissen, wenn es nicht ...

UPDATE !:

@CaptJak Hey, sorry, die nicht für Sie arbeiten heraus .. ich den folgenden Code geschrieben, und es funktioniert ohne Probleme hier .. Ich verband es mit einem Klick auf den Knopf .. versuchen Sie es und lassen Sie es mich wissen! (PS: Ich habe auch Animationen hinzugefügt!).

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

Nein, funktioniert nicht. Ich erstelle das dst VC nicht programmgesteuert und "self.destinationViewController" funktioniert nicht, wenn ich meine Quell-VC einstelle. Der obige Code stammt von einer 'UIStoryBoardSegue'-Unterklasse (daher der Quell- und der ZielView-Controller). Doing das oben genannte gibt mir auch keine Animation ... – CaptJak

+0

hast du noch weitere Vorschläge? – CaptJak

+0

@CaptJak überprüfe mein neues Update! – Albara

5

Mit Hilfe der Antwort von Albara konnte ich auch ein Segment mit der gleichen Animation erstellen. Der benutzerdefinierte Abschnitt ist wie folgt:

- (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)]; 
    }]; 

} 

Nur eine Frage der Umbenennung, wirklich.

+0

sir wie werde ich diese ansicht mit uigesturerecongniton entfernen? –

2

Ich habe gerade NDOverlayViewController erstellt, um so etwas zu tun. Tatsächlich kann es einen Ansichts-Controller über eine andere Kante mit variablen Offset-, Ausdehnungs- und Animationsoptionen überlagern/schieben. Ich habe es als ein Experiment erstellt, aber vielleicht wird es für jemanden hilfreich sein?

Verwandte Themen