2012-03-27 6 views
1

Ich versuche, einen Übergang für einen bestimmten SubView unter vielen zu animieren. Ursprünglich, als ich versuchte, die transitionFromView:toView: durchzuführen animierte es die gesamte superView, die nicht was ich will. Ich möchte nur die spezifischen subViews animieren. Also suchte ich und fand dieses:. Transition behavior using transitionFromView and transitionWithView, die einen Behälter Ansicht schlägt die Erstellung der Animationen in auszuführen Ok, einfach genug, so kam ich mit diesem Code auf:UIView transitionFromView: toview: nicht Animieren

UIView *container = [[UIView alloc] init]; 
container.frame = selected.frame; 
selected.frame = container.bounds; 
[selected.superview addSubview:container]; 
[container addSubview:selected]; 
[UIView transitionFromView:selected toView:normal duration:.2f options:UIViewAnimationOptionTransitionFlipFromLeft completion:^(BOOL fin){ 
    normal.frame = container.frame; 
    [container.superview addSubview:normal]; 
    [container removeFromSuperview]; 
}]; 

Aber jetzt bekomme ich gar keine Animation. Ich vermisse wahrscheinlich etwas Einfaches, aber ich kann es nicht finden. Irgendwelche Ideen?

UPDATE

der Werte Alle initialisiert. Wenn ich kurz vor diesem Codeblock läuft breche diesen Ich ziehe nach oben durch die Debugger-Konsole:

(gdb) po normal 
<SLabel: 0x9c43150; frame = (0 0; 40 40); text = '28'; tag = 28; layer = <CALayer: 0x9c43190>> 
(gdb) po selected 
<SLabel: 0x9ca5f00; frame = (137 148; 45 37); text = '28'; tag = 28; layer = <CALayer: 0x9c596b0>> 
(gdb) po [normal superview] 
Can't print the description of a NIL object. 
(gdb) po [selected superview] 
<UIView: 0x9c4c890; frame = (0 0; 320 190); layer = <CALayer: 0x9c4c8c0>> 

Nachdem der Code durch die Leitung 5 (unmittelbar vor dem Übergang Methode) ausgeführt wird, erhalte ich:

(gdb) po container 
<UIView: 0x848bfc0; frame = (47 74; 45 37); layer = <CALayer: 0x9c32b10>> 
(gdb) po [container superview] 
<UIView: 0x9c4c890; frame = (0 0; 320 190); layer = <CALayer: 0x9c4c8c0>> 
(gdb) po [selected superview] 
<UIView: 0x848bfc0; frame = (47 74; 45 37); layer = <CALayer: 0x9c32b10>> 

So scheint alles in Ordnung zu sein. Der Container wird an der Position der ausgewählten Ansicht platziert (die Ansicht, aus der ich spiegeln möchte). Der Container wurde der Superansicht der ausgewählten Ansicht hinzugefügt. Die ausgewählte Ansicht wird innerhalb des Containers platziert. Und schließlich wird der Übergang ausgeführt (mit anschließender Reinigung). Aber ich bekomme immer noch keine Animation ... der Übergang erfolgt sofort.

Bitte beachten Sie, dass der Übergang zwischen der Ansicht korrekt auftritt. Ich bekomme überhaupt keine Animation.

Eine weitere Frage: Hat die Umstellung Aussicht auf eine Subview sein, egal wie weit entfernt, eine UINavigationController Ansicht, um die Animation zu führen? Ich habe noch nie eine Anforderung wie diese gesehen, an die ich mich erinnern kann, aber es ist der eine Nicht-Standard-Aspekt meines Codes. Wenn Sie den Superansichten jeder Ansicht folgen, wird nicht einer Teil eines Nav-Controllers sein, bevor er das Fenster erreicht. Manchmal hängen Apples Frameworks auf unerwartete Weise aufeinander ... Ich habe mich gefragt, ob das einer von ihnen war.

Die endgültige Antwort war, dass alle mein Code richtig war. Was passierte, ist layoutSubviews wurde aufgerufen, nachdem ich die Animation gestartet hatte, die alle meine Subviews neu arrangiert hatte, bevor die Animation überhaupt eine Chance hatte zu starten. Ich bin mir nicht ganz sicher, warum es hieß. Ich habe es nicht von meinem Code aus aufgerufen, also veranlassten meine bewegenden Ansichten aus irgendeinem Grund UIView dazu, es zu nennen. Jedenfalls habe ich meinen Code aus layoutSubviews in eine private Methode verschoben und nur aufgerufen, wenn sich die Größe der Ansicht ändert. Alles funktioniert jetzt. :)

Antwort

0

Der Code, den Sie dort setzen nicht Fehler hat, das einzige, was ich denken kann, ist, dass Sie ein Problem an anderer Stelle haben. Sie sind sicher, dass Ihre Containeransicht zu Ihrer Ansicht führt, die angezeigt wird?

In welcher Methode Sie es nennen?

Weil die Animation zu tun, was Sie tun müssen, unten gezeigt wird (und aus dem Code schreiben Sie hier Sie es tun):

UIView* normalView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; 
[normalView setBackgroundColor:[UIColor redColor]]; 
UIView* selectedView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; 
[selectedView setBackgroundColor:[UIColor blueColor]]; 

UIView* container = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)]; 
[container setBackgroundColor:[UIColor grayColor]]; 

[container addSubview:selectedView]; 
[self.view addSubview:container]; 

Und dann rufen Sie die Methode der Flip zu tun.

[UIView transitionFromView:selectedView toView:normalView duration:2.0 options:UIViewAnimationOptionTransitionFlipFromRight completion:^(BOOL fin){}]; 
+0

Nun, alle Objekte sind korrekt initialisiert (ich werde das zu meiner Frage hinzufügen). Sie erwähnen 'self.view', aber dieser Code befindet sich in einer UIView-Unterklasse, stattdessen wäre es nur' self'. Muss der Container eine direkte Unteransicht von 'self' sein, da die normale Superview (' selectedView.superview') eine direkte Unteransicht von 'self' ist, aber der container nicht (es ist eine Subview einer Subview von' selbst "). –

+0

Nein ... vergiss es. Ich habe versucht, den Container als Subview von "self" zu setzen, und ich bekomme das gleiche Verhalten. –

+0

Sorry @AaronHayman, aber brauchen mehr Informationen, um Ihnen zu helfen. Wie, wo du es nennst. Sie sehen den Übergang? Weil in der ViewDidLoad zum Beispiel Sie die Animation sehen können. Am Ende des Prozesses sehen Sie die normale oder die ausgewählte Ansicht? Sie ändern sich ohne Animation oder ändern sich nicht? – ggrana