• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Die Bildungsoffensive hier im Forum geht weiter! Jetzt sollen Kreativität und technische Möglichkeiten einen neue Dimension erreichen. Das Thema in diesem Monat lautet - Verkehrte Welt - Hier geht es lang --> Klick

CGRect wird einfach nicht verschoben

graf_schokula

Stechapfel
Registriert
24.05.10
Beiträge
158
Hallo,

ich sitze schon den ganzen Tag an folgenden Problem:
Ich möchte eine ImageView (es handelt sich um einen rotierenden Stab) per Knopfdruck (so wie man Mario und Luigi bewegt) in die Himmelsrichtungen bewegen:

Diese beiden Methoden, die aufgerufen werden, wenn man den Button gedrückt hält (in diesem Fall, Richtung: nach unten)
Code:
//method starts a timer, wich calls the method wich moves the stick down.
- (void) startTimerToMoveStickDown
{
	//Timer to Move Stick Down
	timerMovesStickDown = [NSTimer scheduledTimerWithTimeInterval:1
														   target:self 
														 selector:@selector(stickIsMovingDown) 
														 userInfo:nil 
														  repeats:YES];
	
	[timerMovesStickDown fire];
	
	
}
//method wich actually moves the stick by changing the position values of the CGRect (the stick)
- (void) stickIsMovingDown
{
	
	stick.frame = CGRectMake (100, 150,64,64);

Es soll also eigentlich ein Timer gestartet werden, der das Image Schritt für Schritt verschiebt. Die Methode "stickIsMovingDown" wird in diesem Testfall aber nur einmal aufgerufen (es soll der Stick testweise mal um 50 Pixel verschoben werden), allerdings tut er das nicht.
Ich hab auch gegoogelt und gefunden, dass es eigentlich mit den Properties "imageview.frame" neusetzen funktionieren sollte, tuts bei mir aber aus irgendeinem Grund nicht.

Vielen Danke für eure Zeit, wär super wenn jemand eine Lösung wüsste.

mfG,
graf_schokula
 
ich habe mittlerweile herausgefunden, dass sich das ImageView verschiebt. Allerdings verschiebt sich ständig der Mittelpunkt des Images (aufgrund der permanenten Drehung), deshalb funktioniert es nicht wie gewünscht.

//method wich actually moves the stick by changing the position values of the CGRect (the stick)
- (void) stickIsMovingDown
{

CGFloat minY = CGRectGetMaxY(stick.frame);
stick.frame = CGRectMake (100, minY+0.00000000000000000000000000000000000000001,64,64);
}

Ich verschiebe das Image ausserdem nur um 0.000000000000000000000001 (ich hab die Zahl ewig lang gemacht, weit ausserhalb herkömmlicher Float-Grenzen) alle 0.0001, trotzdem verschiebt sich das Image nicht flüssig, sondern grob schrittweise, und sehr schnell. Weiss jemand evtl. woran das liegen könnte?
Äusserst seltsam finde ich ausserdem, dass der Stab, der sich dreht, wärhend der Verschiebung ständig seine Länge ändert, das kann ich mir einfach nicht erklären, denn ich verändere nichts an der Größe des Rahmens (frames). Wie man in der Methode sieht bleibt die Höhe und die Breite jeweils 64.
 
Hallo,

beim einfachen darauf Schauen ist mir aufgefallen, dass du den Timer auf 1x pro Sekunde setzt. Für eine flüssige Bewegung solltest du hier einen Wert von mindestens 25/Sek (1.0 / 25.0), besser 30/Sek (1.0 / 30.0) wählen.

Dann würde ich die stickIsMovingDown() Methode wie folgt schreiben:
Code:
CGRect rect = stick.frame; // Frame des View kopieren
rect.origin.y += 1.0;      // ein Punkt nach unten schieben
[stick setFrame: rect];    // und dem ImageView wieder zuweisen
// es kann sein, dass das View neu gezeichnet werden muss.
// für diesen Fall die folgende Zeile benutzen
//[stick setNeedsDisplay];
 
Mal so nebenbei. stickIsMovingDown() bezeichnet eine C-Funktion keine Objective-C Methode. Als Objective-C Methode heißt das einfach stickIsMovingDown

Verzeihung, dass ich nach über 20 Jahren nicht-Objective-C Programmierung versehentlich in die doxygen - Syntax zum Kennzeichnen von Methoden- und Funktionslinks verfallen bin - was für Objective-C mit doxygen übrigens immer noch gängiges Verfahren ist...
Aber trotzdem vielen Dank für den Hinweis, graf_schokula wird damit bestimmt sehr geholfen sein.
 
Aber trotzdem vielen Dank für den Hinweis, graf_schokula wird damit bestimmt sehr geholfen sein.
Höre ich da Ironie heraus? Ich habe nicht umsonst 'Mal so nebenbei' dazu geschrieben. doxygen kenne ich nicht, ist auch irrelevant. Der Objective-C Compiler wird jedenfalls so etwas wie
Code:
@selector(stickIsMovingDown())
nicht verstehen.

MacApple