Ich habe 3 UIViews Header / Tabar / Container eingebettet eine ScrollView in einem ViewController. Das ist meine Struktur:
Im ContainerView lade ich eine UICollectionView (so):
%Vor%Alles funktioniert einwandfrei, alle Zellen der UICollectionView werden geladen, ... Das einzige Problem ist, dass alle versteckten Zellen (und sogar alle Teile von Zellen, die versteckt sind) nicht auswählbar sind. Was ich meine, ist meine Funktion "didSelectRowAtIndexPath" funktioniert nicht für jeden Pixel aus dem ersten Bildschirm. Dies ist ein Schema meines Problems:
Dies ist, was ich vor der Rolle habe (auf der linken Seite ist ein Schema, auf der rechten Seite ist das, was ich tatsächlich auf dem Bildschirm habe) - & gt; hier funktioniert alles gut:
Dies ist, was ich nach der Rolle habe (auf der linken Seite ist ein Schema, auf der rechten Seite ist das, was ich tatsächlich auf dem Bildschirm habe) - & gt; Nur die Pixel, die vor dem Bildlauf angezeigt wurden, können "didSelectRowAtIndexPath" aufrufen:
Das Problem liegt darin, dass self.view.frame nicht gut auffrischt. Hast du eine Vorstellung davon, wie ich diesen Rahmen wann ändern soll?
Problemdefinition:
Die ganze Zeit, in der wir auf eine Situation treffen, war unser UIViewController
, zusätzlich zur Scroller-Ansicht, Header und Tab-Balken. Das Problem ist, dass diese zusätzlichen Ansichten den Bereich reduzieren, der unserem Scroller zugeordnet ist (in diesem Fall UICollectionView
). In kleinen Bildschirmgeräten zeigt unser Scroller eine kleine Anzahl von Elementen gleichzeitig an.
Lösungsvorschlag:
Lassen Sie diese zusätzlichen Ansichten mit dem Scroller scrollen Gegenstände.
Wie man es anwendet?!
Die bequemste Lösung, um das zu erreichen. Erscheint in der Scroller-Ansicht. Das UICollectionView
zum Beispiel bietet Ergänzende Elemente (Kopf- und Fußzeilen), die mit den Elementen der Sammlungsansicht scrollen. Verschieben Sie Ihre Kopfzeile und Tableiste in den Kopfbereich von UICollectionView
. Implementiere dann viewForSupplementaryElementOfKind
in deinem View-Controller:
Interface Builder:
Der Kopfbereich für UICollectionView
existiert bereits. Sie müssen jedoch die height dafür über den Schnittstellen-Builder festlegen, damit sie in der Entwurfszeit angezeigt wird. Vergessen Sie nicht, den Collection Reusable View Identifier für den Header festzulegen.
Hinweis: Dies erfordert auch einige zusätzliche Arbeit, um die Gesten auf Ihrer Kopfzeile und TabBar festzulegen.
Aktualisierung:
Ziehen Sie in Erwägung, den Header und den Tabbar-Container zu entfernen und ihn zur Laufzeit an der richtigen Stelle als Unteransicht hinzuzufügen. Wenn die Registerkarte UICollectionView geklickt wird, übergeben Sie sie an die wiederverwendbare Ansicht des Headers in der Methode viewForSupplementaryElementOfKind
. Wenn eine Registerkarte mit Etiketten angeklickt wird, fügen Sie sie über die Containeransicht der Etiketten hinzu. und wenn es eine Tabellenansicht ist, übergeben Sie sie an die UITableView-Kopfzeile in der headerForRow-Methode.
Dies scheint die Fortsetzung eines anderen Problems zu sein, das Sie in einer anderen Frage erwähnt haben >.
Wenn ich mir die Storyboard-Hierarchie anschaue, vermute ich, dass das Problem darin besteht, dass Sie die Höhe Ihres tab bar view
nicht ändern, wenn Sie die Inhaltsgröße der Scroll-Ansicht und die Höhe der Sammelansicht ändern. Die Sammlungsansicht ist immer noch sichtbar, wahrscheinlich, weil Ihr Container tab bar view
keinen Inhalt abschneidet ( clipToBounds=false
). Aber da die Ansicht selbst nicht so weit reicht, werden Berührungen von der Ansicht und ihren Unteransichten nicht erkannt.
Stellen Sie sicher, dass die Hauptansicht, die Inhaltsansicht der Inhaltsansicht (Inhaltsgröße), die Registerkartenansicht und die Sammlungsansicht korrekt skaliert sind. Da Sie sich entschieden haben, nicht mit der Standardansichtshierarchie (Zusatzansicht oder Kopfansicht) zu gehen, müssen Sie den Aufwand für die Verwaltung der Ansichtsgrenzen selbst übernehmen.
Tags und Links scroll ios uicollectionview swift didselectrowatindexpath