Hoffentlich kann jemand mit diesem Problem helfen. Ich habe eine Klasse, die von UIScrollView abgeleitet ist, und ich möchte verhindern, dass der Benutzer über manuelle Pinch- und Swipe-Gesten zoomen oder blättern kann. Die gesamte Ansichtsnavigation wird statt dessen durch programmatische Mittel in Abhängigkeit davon gesteuert, wo ein Benutzer tippt (man denke an einen Ebook-Reader, bei dem durch Antippen der linken oder rechten Seite der Anzeige die Ansicht um genau eine Seitenbreite scrollt). Irgendwelche Vorschläge zur Umsetzung?
Auf deinem - (void)viewDidLoad;
solltest du einfach den gewünschten Gestenerkenner deaktivieren können. In diesem Fall:
oder
%Vor% Ich mache das manchmal von View-Controllern, die UIScrollViews enthalten. Ich ziele nur auf die Bildlaufansicht ( self.scrollView.pinchGestureRecognizer
) und vorübergehend Gesten deaktivieren, wenn die App. ist in einem bestimmten Zustand.
Um zu verhindern, dass Benutzer-Controller zoomen und schwenken, aber dennoch programmgesteuertes Zoomen und Verschieben eines Bildlaufs ermöglichen, besteht die beste Methode darin, die -addGestureRecognizer:
-Methode von UIScrollView in einer Unterklasse zu überschreiben.
In meiner Verwendung wollte ich alle Erkenner blockieren und den sichtbaren Bereich vollständig von meinem View-Controller aus steuern, ich tat es so:
Jede Gestenerkennung wird einfach deaktiviert, um eine feinere Steuerung zu ermöglichen (die Schwenksteuerung zuzulassen, aber z. B. nur durch Doppeltippen zu zoomen). Sie würden einfach den eingehenden Gestenerkenner über -isKindOfClass:
überprüfen und gegebenenfalls deaktivieren.
Ich habe diese Methode in einer App zum Lesen von Comics verwendet, bei der die animierte Navigation zwischen beschnittenen Feldern auf einer Seite mit der vollständigen Seite in einem UIScrollView verwendet wird. Durch einfaches Einstellen der Ansicht kann ich einen ausgewählten Bereich problemlos vergrößern und verkleinern Grenzen zu der Region, die ich anzeigen möchte.
Eine kurze Notiz hier. Es scheint, dass UIScrollView
s panGestureRecognizer
und pinchGestureRecognizer
beide aktiviert sind, wenn ein View-Controller das erste Mal einem Fenster hinzugefügt wird.
Grundsätzlich bedeutet das, dass sie in enabled = NO
in viewDidLoad
gesetzt werden. Ich habe mein enabled = NO
nach viewWillAppear:
verschoben und es blieb hängen. :)
Ich habe nicht allzu viel Erfahrung mit UIScrollView
s, aber wenn ich mir die Dokumente ansehe, sieht es so aus, als könnten Sie maximumZoomScale
, minimumZoomScale
und scrollEnabled
einstellen, um alles zu deaktivieren, was Sie deaktivieren möchten / p>
Hier finden Sie die Dokumentation: Ссылка
Aus der Dokumentation:
scrollEnabled
:
Wenn der Wert dieser Eigenschaft JA ist, Scrollen ist aktiviert, und wenn es NEIN ist Scrollen ist deaktiviert. Der Standard ist JA.
Wenn der Bildlauf deaktiviert ist, blättern Sie Die Ansicht akzeptiert keine Berührungsereignisse. es leitet sie die Antwortkette hinauf.
maximumZoomScale
:
Dieser Wert bestimmt, wie groß der Inhalt kann skaliert werden. Es muss sein größer als die minimale Zoomskala zum Zoomen, um aktiviert zu werden. Der Standard Wert ist 1.0.
Überschreiben Sie in Ihrer UIScrollView-Unterklasse auch die setZoomScale: -Methode, die die Geste automatisch wieder deaktiviert
%Vor%Tags und Links ios cocoa-touch uiscrollview
Ich möchte die Position der Ansicht auf dem Bildschirm finden.
Dafür verwende ich die Methoden wie %code% , %code% , %code% , %code% . Aber leider werden alle diese Methoden %code% zurückgegeben.
Gibt es alternative Möglichkeiten, die Positionen der Ansicht zu finden (z. B. Koordinaten auf dem Bildschirm)?
Mein Layout %code% :
%Vor%Und meine Klasse hat das in %code% :
%Vor%Die Methoden, die Sie geschrieben haben, reichen aus finde den Ort auf dem Bildschirm, aber der Ort, an dem du geschrieben hast, ist nicht korrekt.
Versuchen Sie, die Methoden (view.getLeft (), view.getTop () ... usw.) in onWindowFocusChanged (boolean hasFocus) -Methode zu schreiben.
zum Beispiel ...
**
%Vor%**
Es wird Ihr Problem lösen.
Ich bin nicht sicher, ob Sie die Position der Ansicht erhalten können, bevor die Layout-Phase durchgeführt wurde. Sobald die Ansicht geöffnet ist, können Sie %code% verwenden, um die Position der Ansicht zu erhalten. %code% und ähnlich gibt nur die Position der Ansicht im übergeordneten Element zurück.
Der einfachste Weg ist, es zu benutzen %code% ODER %code%
Und wenn Sie eine Position relativ zum root Layou t möchten, Siehe
Verwenden Sie %code% , %code% , %code% und %code% . Diese können verwendet werden, nachdem die Ansicht instanziiert wurde.
Sie können wirklich nicht die Aussicht vor der Hand bekommen. Möglicherweise möchten Sie eine explizite Verwendung von %code% vornehmen, wenn dies möglich ist, oder Sie können dies in der Funktion %code% oder %code% überprüfen.
Wenn Sie nur Dinge ausprobiert haben und Spaß mit Threads haben möchten, wird dieser Code-Block Ihren Code auf den UI-Thread setzen und darauf warten, dass alles gerendert wird und dann Ihren Code anzeigen:
%Vor%Das letzte ist ziemlich schweres Heben, aber es wird die Arbeit erledigt. Normalerweise lege ich solche Zeilen in meine Logs (zB %code% )