Ja, ich weiß, das Thema wurde schon 7808108972348912309x durchgekaut. Und ich habe es immer noch nicht verstanden.
Folgende Situation, es handelt sich um den Versuch das NSDraggingSource Protokoll korrekt zu bedienen:
Alles anzeigen
Sowohl -setCoordinate: als auch -setCurrentDragStatus: feuern am Ende ein -setNeedsDisplay: auf das beinhaltende Subview.
Vorsorglich habe ich das mit einer Ausgabe 'It changed.' versehen.
Die Logausgaben sind auch recht eindeutig:
Man kann das zu beobachtende Verhalten dem Log entnehmen:
Beginnt der Drag, soll der dragStatus auf 'lifted' angepasst werden: die Annotation schwebt 10px über dem Erdboden.
(Später wird's vielleicht mal ne Animation, so mit aus dem Boden reißen, kiloweise Erde rumschmeißen, hektoliter Erdöl vergießen und so weiter.)
Das passiert gefühlt nie. Tatsächlich kann ich mir die Leertaste zur Hilfe nehmen.
Sobald ich die Maus bewege und das Dragging einsetzt, schwebt die Annotation und folgt ganz brav dem Mauszeiger.
Lasse ich die Maustaste los, dann schwebt die Annotation noch für eine variable Zeit x in der Gegend rum und ist dann irgendwann unten.
Die variable Zeit x lässt sich reduzieren, in dem der Scrollbalken betätigt wird, ich das View verlasse und zurückkehre oder ich wieder auf die Leertaste ausweiche.
Entgegen der Aussage des Logs ist es aber sowohl hier notwendig als auch von einem Menschen gebraucht.
Welche Möglichkeiten habe ich, um dieses Problem der ignorierten -setNeedsDisplay: zu lösen?
Auf [self drawInRect:[self frame]]; habe ich allerdings nur bedingt Lust, ein sauberer Weg ist mir lieber.
Folgende Situation, es handelt sich um den Versuch das NSDraggingSource Protokoll korrekt zu bedienen:
C-Quellcode
- // 1st
- - (void)draggingSession:(NSDraggingSession *)session willBeginAtPoint:(NSPoint)screenPoint
- {
- CMAnnotationView * myView = [[self annotationViews] objectForKey:[self draggedAnnotation]];
- [myView setCurrentDragStatus:CMAnnotationDragLifting];
- [self setNeedsDisplay:YES];
- NSLog(@"hier nicht notwendig.");
- }
- // 3rd
- - (void)draggingSession:(NSDraggingSession *)session movedToPoint:(NSPoint)screenPoint
- {
- NSPoint recalculatedPoint = [self recalculateScreenPoint:screenPoint];
- [[[self annotationViews] objectForKey:[self draggedAnnotation]] setCoordinate:recalculatedPoint];
- CMAnnotationView * myView = [[self annotationViews] objectForKey:[self draggedAnnotation]];
- [myView setCurrentDragStatus:CMAnnotationDragDragging];
- [self setNeedsDisplay:YES];
- NSLog(@"hier notwendig.");
- }
- // 4th
- - (void)draggingSession:(NSDraggingSession *)session endedAtPoint:(NSPoint)screenPoint operation:(NSDragOperation)operation
- {
- CMAnnotationView * myView = [[self annotationViews] objectForKey:[self draggedAnnotation]];
- [myView setCurrentDragStatus:CMAnnotationDragPinned];
- [self setNeedsDisplay:YES];
- NSLog(@"braucht hier kein mensch.");
- [self setDraggedAnnotation:nil];
- }
- // 3rd b
- - (BOOL)ignoreModifierKeysForDraggingSession:(NSDraggingSession *)session
- {
- return YES;
- }
Sowohl -setCoordinate: als auch -setCurrentDragStatus: feuern am Ende ein -setNeedsDisplay: auf das beinhaltende Subview.
Vorsorglich habe ich das mit einer Ausgabe 'It changed.' versehen.
Die Logausgaben sind auch recht eindeutig:
2012-07-17 16:51:11.185 DemoApplications[4973:503] [DEBUG] No delegate is set.
2012-07-17 16:51:16.607 DemoApplications[4973:503] It changed.
2012-07-17 16:51:16.607 DemoApplications[4973:503] hier nicht notwendig.
2012-07-17 16:51:16.764 DemoApplications[4973:503] It changed.
2012-07-17 16:51:16.764 DemoApplications[4973:503] hier notwendig.
2012-07-17 16:51:16.797 DemoApplications[4973:503] hier notwendig.
.
.
.
2012-07-17 16:51:17.562 DemoApplications[4973:503] hier notwendig.
2012-07-17 16:51:18.427 DemoApplications[4973:503] hier notwendig.
2012-07-17 16:51:18.981 DemoApplications[4973:503] It changed.
2012-07-17 16:51:18.982 DemoApplications[4973:503] braucht hier kein mensch.
Man kann das zu beobachtende Verhalten dem Log entnehmen:
Beginnt der Drag, soll der dragStatus auf 'lifted' angepasst werden: die Annotation schwebt 10px über dem Erdboden.
(Später wird's vielleicht mal ne Animation, so mit aus dem Boden reißen, kiloweise Erde rumschmeißen, hektoliter Erdöl vergießen und so weiter.)
Das passiert gefühlt nie. Tatsächlich kann ich mir die Leertaste zur Hilfe nehmen.
Sobald ich die Maus bewege und das Dragging einsetzt, schwebt die Annotation und folgt ganz brav dem Mauszeiger.
Lasse ich die Maustaste los, dann schwebt die Annotation noch für eine variable Zeit x in der Gegend rum und ist dann irgendwann unten.
Die variable Zeit x lässt sich reduzieren, in dem der Scrollbalken betätigt wird, ich das View verlasse und zurückkehre oder ich wieder auf die Leertaste ausweiche.
Entgegen der Aussage des Logs ist es aber sowohl hier notwendig als auch von einem Menschen gebraucht.
Welche Möglichkeiten habe ich, um dieses Problem der ignorierten -setNeedsDisplay: zu lösen?
Auf [self drawInRect:[self frame]]; habe ich allerdings nur bedingt Lust, ein sauberer Weg ist mir lieber.
«Applejack» "Don't you use your fancy mathematics to muddle the issue!"
Iä-86! Iä-64! Awavauatsh fthagn!
Iä-86! Iä-64! Awavauatsh fthagn!
kmr schrieb:
Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P