Ich schreibe eine Mac-App, die eine Sammlungsansicht enthält. Diese App soll auf einem großen Touchscreen-Display laufen ( 55 "EP-Serie von Planar) Aufgrund von Hardwarebeschränkungen sendet der Touchscreen keine Scroll-Ereignisse (oder auch keine Multitouch-Ereignisse). Wie kann ich die App dazu bringen, zu glauben, dass ein "mousedown + drag" dasselbe ist wie ein "mousescroll"?
Ich habe es halbwegs geschafft, indem ich NSCollectionView abgeleitete und meinen eigenen NSPanGestureRecognizer-Handler darin implementierte. Leider ist das Ergebnis klobig und hat nicht das Gefühl eines normalen OS X-Scrolls (d. H. Der Geschwindigkeitseffekt am Ende einer Scroll oder Scroll-Bounce an den Enden des Inhalts).
%Vor% Ein Hinweis zu dieser Implementierung: Ich habe scrollScaling
und pointSmoother
zusammen gestellt, um zu versuchen, die Scroll-UX zu verbessern. Der Touchscreen, den ich benutze, ist IR-basiert und wird sehr nervös (besonders wenn die Sonne draußen ist).
Falls es relevant ist: Ich verwende Xcode 6 beta 6 (6A280e) auf Yosemite beta (14A329r) und mein Buildziel ist 10.10.
Danke!
Ich hatte Erfolg mit einem NSPanGestureRecognizer und simulierte Track-Pad-Scrollrad-Ereignisse. Wenn Sie sie gut simulieren, erhalten Sie den Bounce von NSScrollView 'kostenlos'.
Ich habe keinen öffentlichen Code, aber die beste Ressource, die ich gefunden habe und die erklärt, was NSScrollView erwartet, ist im folgenden Komponententest, der eine Impulsrolle simuliert. (Siehe mouseScrollByWithWheelAndMomentumPhases
hier).
Die Implementierung von mouseScrollByWithWheelAndMomentumPhases
gibt einige Tipps zur Synthese der Scroll-Ereignisse auf niedriger Ebene. Eine Ergänzung, die ich fand, die ich brauchte, war, einen steigenden Zeitstempel in das Ereignis zu setzen, damit die Bildlaufansicht Ball spielen kann.
Um die abklingende Geschwindigkeit tatsächlich zu erzeugen, habe ich ein POPDecayAnimation
verwendet und die Velocity von NSPanGestureRecognizer
so eingestellt, dass sie sich ähnlich anfühlt. Es ist nicht perfekt, aber es bleibt NSScrollView
Bounce treu.
Ich habe ein (totes) Projekt auf Github , das tut das mit einem NSTableView
, also hoffentlich wird es gut funktionieren ein NSCollectionView
.
Disclaimer: Ich schrieb dies, während ich noch GCD lernte, also pass auf Retain-Zyklen auf ... Ich habe nicht geprüft, was ich gerade für Bugs gepostet habe. Fühlen Sie sich frei, etwas zu zeigen :) Ich habe es gerade auf Mac OS 10.9 getestet und es funktioniert immer noch (ursprünglich für 10.7 IIRC geschrieben), nicht am 10.10 getestet.
Diese ganze Sache ist ein Hack, um sicher zu sein, es sieht so aus, als ob es asynchrone UI-Manipulation erfordert (ich denke, um eine unendliche Rekursion zu verhindern). Es gibt wahrscheinlich einen saubereren / besseren Weg und bitte teilen Sie es, wenn Sie es entdecken!
Ich habe das seit Monaten nicht mehr berührt, daher kann ich mich nicht an alle Einzelheiten erinnern, aber das Fleisch davon ist sicherlich im Code NBBTableView
, der Schnipsel von einfügen wird.
Zuerst gibt es eine NSAnimation
Unterklasse NBBScrollAnimation
, die den "Gummiband" -Effekt verarbeitet:
Sie sollten in der Lage sein, die Animation für jedes Steuerelement mit einem NSClipView
zu verwenden, indem Sie es wie folgt einrichten: _scrollAnimation = [[NBBScrollAnimation scrollAnimationWithClipView:(NSClipView*)[self superview]] retain];
Der Trick dabei ist, dass die Superansicht eines NSTableView
ein NSClipView
ist; Ich weiß nicht über NSCollectionView
, aber ich vermute, dass jedes scrollbare Steuerelement NSClipView
verwendet.
Als nächstes macht die NBBTableView
Unterklasse diese Animation durch Mausereignisse:
Ich denke, dass Autoscroll override für gutes Verhalten wesentlich ist.
Der gesamte Code befindet sich auf meiner github-Seite . Wenn Sie interessiert sind, enthält er weitere "Touchscreen" -Emulations-Leckerbissen wie zum Beispiel eine Simulation für die iOS-Sprungbrett-Icons (komplett mit "Wiggle" -Animation mit NSButtons
.
Hoffe das hilft:)
Bearbeiten: Es scheint, dass constrainScrollPoint:
in OS X 10.9 veraltet ist. Es sollte jedoch ziemlich trivial sein, sie als Kategorie oder etwas neu zu implementieren. Vielleicht können Sie eine Lösung von diese SO Frage .
Tags und Links objective-c macos cocoa