2013-10-08 6 views
5

Denken Sie an eine UIScrollView mit eingebetteten (Subview) UIView s, in einer Spalte angeordnet. In iOS6 und zuvor konnte die Bildlaufansicht so konfiguriert werden, dass die eingebetteten Ansichten keine Berührungsereignisse erhalten, wenn Sie sie mit dem Finger bewegen, selbst wenn die erste Berührung auf einer der Teilansichten erfolgt. Wenn Sie jedoch eine Unteransicht berühren, ohne zu blättern, entscheidet die Bildlaufansicht, dass es sich nicht um eine Bildlaufaktion handelt, und leitet die Berührungsereignisse an die eingebetteten Ansichten weiter. Dies war ein sehr praktisches Verhalten, wenn Sie die eingebetteten UIView s innerhalb der UIScrollView ziehen/ablegen wollten.wie man iOS 7 UIScrollView unterdrückt Touch-Ereignisse auf eingebetteten UIView

In iOS 7 zeigt die Dokumentation an, dass das Setzen der UIScrollView Eigenschaft delaysContentTouches dazu führt, dass Touchdown-Ereignisse verzögert werden, bis UIScrollView entscheidet, ob gescrollt wird. Aber das scheint einfach nicht zu funktionieren. Die Unteransicht empfängt sofort Berührungsereignisse und reagiert darauf, wenn sich das Scrolling-Ereignis auf einer der Unteransichten befindet. Wenn die Unteransicht für Drag/Drop programmiert ist, beginnt sie zu ziehen, während die Bildlaufansicht ebenfalls scrollt.

Es scheint, dass das Modell für dieses Verhalten geändert wurde, da iOS 5/6 beide Berührungsereignisse während der Entscheidung, ob es sich um eine Bildlaufaktion handelt, unterdrückt haben. Einige neue Methoden sind jetzt verfügbar, um die Aufsetzereignisse abzubrechen, nachdem der UIScrollView entscheidet, dass er scrollt. Aber das ist natürlich nicht sinnvoll, wenn der Drag/Drop-Code auch begonnen hat, die Subview zu verschieben.

Meine Frage: Gibt es eine Möglichkeit zu verhindern, dass iOS 7 UIScrollView s Low-Level-Touch-Down-Ereignisse auf seinen Unteransichten aufrufen, wenn Sie eine Scroll-Aktion durch Streichen einer Unteransicht initiieren? Wenn ich "Low-Level" sage, meine ich tatsächliche Berührungsereignisse im Gegensatz zur Verwendung von Gestenerkennern. Ich bin überzeugt, dass die Eigenschaft delaysContentTouches auf YES zu setzen, einfach nicht funktioniert.

Dieses Problem hat einen ziemlich komplizierten Code total kaputt gemacht, der reibungslos und schön in iOS 5 und 6 funktionierte; und bis jetzt habe ich keine Möglichkeit gefunden, der UIScrollView zu sagen, dass sie Ereignisse in ihren Unteransichten unterdrückt, bis sie bestimmt, ob sie gescrollt wird oder nicht. Die Ereignisse werden durchlaufen, und ein Abbruch-Berührungsereignis wird später ausgelöst, nachdem die Bildlaufansicht festgestellt hat, dass es gescrollt wird. Es sieht so aus, als ob das zugrundeliegende Modell für das schlechtere neu definiert wurde, oder das ist ein Fehler. Alle Einsichten werden sehr geschätzt.

Antwort

0

Sind Sie sicher, dass es unter iOS5/6 funktionierte? Basierend auf meiner Erfahrung und Beiträge wie UIScrollview delaysContentTouches issue funktioniert es nicht.

Vielleicht hilft Ihnen ein Beispielcode, der auf iOS5/6, aber nicht auf iOS7 funktioniert, bei der Beantwortung Ihrer Frage.

0

Dies funktioniert für mich:

[scrollView setCanCancelContentTouches:YES]; 
[scrollView setDelaysContentTouches:YES];