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. :)
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 "). –
Nein ... vergiss es. Ich habe versucht, den Container als Subview von "self" zu setzen, und ich bekomme das gleiche Verhalten. –
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