Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   iOS XE5 + iOS: AnimationDelegate und Selector für AnimationDidStopSelector erstellen??? (https://www.delphipraxis.net/178929-xe5-ios-animationdelegate-und-selector-fuer-animationdidstopselector-erstellen.html)

romber 4. Feb 2014 13:23

XE5 + iOS: AnimationDelegate und Selector für AnimationDidStopSelector erstellen???
 
Hallo!

Ich mehrere Animationen nach einander ausführen lassen. Dafür muss ich jeder Animation den Delegate und ein Selector auf eine Methode innerhalb des Delegates zuweisen. Alle meine Versuche bleiben bis jetzt erfolglos.

Beim suchen bin in auf diesen Thread auf Embarcadero-Forum gestoßen. Dort postet der Autor eine Lösung, aber leider nicht vollständig. Es muss ein Delegate (objcclass) erstellt und dort die neue Methode implementiert werden. Kann mir jemand erklären, wie das geht? Im Voraus vielen Dank!

jensw_2000 5. Feb 2014 06:39

AW: XE5 + iOS: AnimationDelegate und Selector für AnimationDidStopSelector erstellen?
 
Ray Wenderlich hat ein schönes Tutorial über die UIAminations geschrieben.
http://www.raywenderlich.com/2454/ui...view-animation.

In Abschnitt "How To Chain Animations" steht die Antwort auf deine Frage.
Du erstellst Dir für jede Teilanimation eine einzelne Methode, in der du deinen ViewController zum UIAnimationDelegate der zu animierenden View machst und mit "UIView.<setAnimationDidStopSelector" festlegst was nach dem Ablaufen der Teilanimation aufgerufen werden soll. In Deinem Fall die nächste Teilanimation konfigurieren und starten ...

romber 5. Feb 2014 07:47

AW: XE5 + iOS: AnimationDelegate und Selector für AnimationDidStopSelector erstellen?
 
Zitat:

Zitat von jensw_2000 (Beitrag 1246723)
Ray Wenderlich hat ein schönes Tutorial über die UIAminations geschrieben.
http://www.raywenderlich.com/2454/ui...view-animation...

Vielen Dank für diesen Link. Diesen Tutorial habe ich auch schon gelesen, hilft mir aber nicht weiter. Wie das in Xcode geht, weis ich. In Xcode würde ich sogar gar gar kein Selector erstellen, sondern direkt innerhalb
Code:
completion:^(BOOL finished){ }
die nächste Animation starten.

Mein Problem ist, dies in Delphi zu implementieren. Ich habe immer noch ein Verständnisproblem mit der Deklarationen von ObjC-Classen und registrierung von Methoden innerhalb dieser Klassen. In meinem Fall z.B. muss ich eine ObjectiveC-Klasse erstellen und dort eine neue Methode deklarieren, die ich später als Selector an die Animation übergebe. Bei der Methode für den animationDidStopSelector muss eine bestimmte Form eingehalten werden:
Code:
- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
Kurz gesagt, ich habe es bis jetzt nicht geschafft. Kann mir jemand mit einem Code-Beiespiel helfen? Danke!

jensw_2000 5. Feb 2014 08:36

AW: XE5 + iOS: AnimationDelegate und Selector für AnimationDidStopSelector erstellen?
 
Unter dem Strich muss es am Ende doch etwa so aussehen ...
Delphi-Quellcode:
interface
  TmyViewController = class(TIrgendwasFMXUIViewControllerWrap&Pizza)
  private
    procedure viewDidAppear(..);
    procedure myAnimation1DidStop(const finished: NSInteger); message 'myAnimation1DidStop:';
    procedure myAnimation2DidStop(const finished: NSInteger); message 'myAnimation2DidStop:';
    procedure myAnimation3DidStop(const finished: NSInteger); message 'myAnimation3DidStop:';

  public
  end;

implementation

procedure TmyViewController.viewDidAppear() // oder was auch immer Du als Trigger zum Starten der ersten Animation nimmst ..
var lSEL: Die_FXM_SELECTOR_Klasse;
begin
  lSEL := sel_registerName( PChar( 'myAnimation1DidStop:'));
  self.View.setAnimationDelegate(self);
  self.View.setAnimationDidStopSelector(lSEL);

  // hier die erste Animation starten
end;

procedure TmyViewController.myAnimation1DidStop(const finished: NSInteger);
var lSEL: Die_FXM_SELECTOR_Klasse;
begin
  lSEL := sel_registerName( PChar( 'myAnimation2DidStop:'));
  self.View.setAnimationDelegate(self);
  self.View.setAnimationDidStopSelector(lSEL);

  // und die 2. Animation starten
end;


procedure TmyViewController.myAnimation2DidStop(const finished: NSInteger);
var lSEL: Die_FXM_SELECTOR_Klasse;
begin
  lSEL := sel_registerName( PChar( 'myAnimation3DidStop:'));
  self.View.setAnimationDelegate(self);
  self.View.setAnimationDidStopSelector(lSEL);

  // und die 3. Animation starten
end;

procedure TmyViewController.myAnimation3DidStop(const finished: NSInteger);
var lSEL: Die_FXM_SELECTOR_Klasse;
begin
  run(do_nothing_loop);
end;

romber 5. Feb 2014 14:03

AW: XE5 + iOS: AnimationDelegate und Selector für AnimationDidStopSelector erstellen?
 
Danke für dieses Beispiel!

An den Deklarationen der Methoden scheitert es mit folgenden Fehlermeldungen:

Delphi-Quellcode:
procedure myAnimation1DidStop(const finished: NSInteger); message 'myAnimation1DidStop:';

E2138 Ungültige Botschaftsparameterliste
E2010 Inkompatible Typen: 'string' und 'Integer'


Ich vermute auch, dass die deklaration der Methode nicht ganz richtig ist. Unter Xcode erwartet die Methode drei Parameter:
Code:
- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
Einer Bootschaftsprocedur können wir dagegen nur ein Parameter übergeben.

jensw_2000 5. Feb 2014 14:41

AW: XE5 + iOS: AnimationDelegate und Selector für AnimationDidStopSelector erstellen?
 
Hast Recht. Der Codeschnipsel im EMBT Forum ist Nonsens.

Laut der Apple Doku muss der Selector exakt folgende Signatur haben:
Delphi-Quellcode:
- (void)myTransitionDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context;
Die Parameter "animationID" und "context" können dabei NIL Werte bekommen.

Unter Oxygene würde ich das so lösen:
Delphi-Quellcode:
type TContext=method();
var aContext:TContext;

method myTransitionDidStop(animationID:NSString) finished(finished:NSNumber) context(aContext);
Wie man das in Delphi ohne "multi-part method names" lösen kann weiß ich nicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:32 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz