Ich habe eine, UIScrollView
die viele UIImageView
s, UILabels usw. enthält. Die Beschriftungen sind viel länger als die UIScrollView
, aber wenn ich die App starte, kann ich nicht klicken und nach unten scrollen ...
Warum könnte das sein?
Vielen Dank
ios
iphone
ipad
uiscrollview
Kennzeichen
quelle
quelle
Antworten:
Es ist immer gut, ein vollständiges Arbeitscode-Snippet anzuzeigen:
Swift 4.0
Ich habe keine Möglichkeit gefunden, contentSize in IB (ab Xcode 5.0) festzulegen .
Hinweis: Wenn Sie Autolayout verwenden, befindet sich der beste Ort zum Einfügen dieses Codes in der
-(void)viewDidLayoutSubviews
Methode.quelle
myScrollView.delegate = self
AUCH einzustellen , wenn dies immer noch nicht funktioniert, hat die Antwort unter diesem einen GROSSEN Rat (gehen Sie zu Ihrem xib / StoryBoard und stellen Sie sicher, dass "AutoLayout" deaktiviert ist). Pro-Tipp: Sie können auch<UIScrollViewDelegate>
in Ihre .h-Datei aufnehmen, wenn Sie beispielsweise programmgesteuert durch Ihre UIScrollView scrollen möchten.viewDidLayoutSubviews
hat es für mich funktioniert.Wenn Sie die Ansicht auch nach korrekter Einstellung von contentSize nicht scrollen können, deaktivieren Sie im Interface Builder -> File Inspector das Kontrollkästchen "AutoLayout verwenden".
quelle
Sie müssen die
contentSize
Eigenschaft der Bildlaufansicht festlegen , damit sie ordnungsgemäß gescrollt wird.Wenn Sie automatisches Layout verwenden, müssen Sie Satz
contentSize
in ,viewDidLayoutSubviews
um es nach dem automatischen Layout abgeschlossen ist angewandt werden.Der Code könnte folgendermaßen aussehen:
quelle
contentSize
aufcontentView
die Größe von setze, die Größe von scrollView und contentView gleich zu sein scheint. Aber wenn Sie die Höhe voncontentSize
auf einen Wert einstellen, der größer als die Höhe von istcontentView
, hat es funktioniert.viewDidLayoutSubviews
kann während eines Lebenszyklus mehrmals aufgerufen werden, sodass Sie das Risiko eingehen, die Höhe größer als erwartet zu erhöhen.Die obige Antwort ist richtig - um das Scrollen zu ermöglichen, muss die Inhaltsgröße festgelegt werden.
Wenn Sie den Interface Builder verwenden, können Sie dies mit benutzerdefinierten Laufzeitattributen tun. Z.B:
quelle
Versuchen Sie, die Größe des Inhalts auf große Zahlen zu ändern. Ich konnte nicht verstehen, warum meine Bildlaufansicht nicht scrollt, selbst wenn die Inhaltsgröße größer als die Steuerelementgröße zu sein scheint. Ich habe festgestellt, dass wenn der Inhalt kleiner als nötig ist, er auch nicht funktioniert.
Anstelle von 2000 können Sie Ihre eigenen großen Zahlen eingeben. Und wenn es funktioniert, bedeutet dies, dass Ihre Inhaltsgröße beim Ändern der Größe nicht groß genug ist.
Der Delegat ist nicht erforderlich, damit die Bildlaufansicht funktioniert.
quelle
Stellen Sie sicher, dass die contentSize-Eigenschaft der Bildlaufansicht auf die richtige Größe eingestellt ist (dh eine, die groß genug ist, um Ihren gesamten Inhalt zu erfassen).
quelle
Deaktivieren Sie "Autolayout verwenden", um den Trick für mich zu erledigen.
Umgebung: xCode 5.0.2 Storyboards ios7
quelle
In meinem Fall musste ich
delaysContentTouches
auf true setzen , da die Objekte in der scrollView alle die Berührungsereignisse erfassten und sich selbst handhabten, anstatt die scrollView selbst damit umgehen zu lassen.quelle
Legen Sie die
contentSize
Eigenschaft derUIScrollview
in-ViewDidLayoutSubviews
Methode fest. Etwas wie dasquelle
Die Idee, warum die Bildlaufansicht nicht gescrollt wird, weil Sie die Inhaltsgröße für das Scrollen weniger als die Größe der Bildlaufansicht festgelegt haben, ist falsch. Sie sollten die Inhaltsgröße größer als die Größe Ihrer Bildlaufansicht festlegen, um beim Scrollen durch die Ansicht zu navigieren.
Die gleiche Idee beim Zoomen ist, dass Sie den Min- und Max-Wert für das Zoomen festlegen, der durch Zoomen angewendet wird.
herzlich willkommen :)
quelle
Eine kleine Ergänzung, alle oben genannten sind die tatsächlichen Gründe, warum Ihre Bildlaufansicht möglicherweise nicht gescrollt wird, aber manchmal kann dies sinnlos der Grund sein, insbesondere wenn die Bildlaufansicht über Code und nicht über IB hinzugefügt wird. Möglicherweise haben Sie Ihre Unteransichten zur übergeordneten Ansicht hinzugefügt und nicht zu In der Bildlaufansicht wird die Unteransicht nicht gescrollt
und halten Sie die Inhaltsgröße festgelegt und größer als der übergeordnete Ansichtsrahmen (duhh !!)
quelle
Ich habe es bei meinem ersten Versuch geschafft. Mit automatischem Layout und allem, kein zusätzlicher Code. Dann ging eine Sammlungsansicht Banane, stürzte zur Laufzeit ab, ich konnte nicht finden, was falsch war, also habe ich sie gelöscht und neu erstellt (ich verwende Xcode 10 Beta 4. Es fühlte sich wie ein Fehler an) und dann war das Scrollen weg. Die Sammlungsansicht funktionierte jedoch wieder!
Viele Stunden später ... das hat es für mich behoben. Ich hatte folgendes Layout:
UIView
Es ist alles in den Zwängen. Der sichere Bereich wird vom System automatisch definiert. Im schlimmsten Fall entfernen Sie alle Beschränkungen für Scroll- und Inhalt Ansichten und haben nicht haben IB Zurücksetzen / sie für Sie zu schaffen. Machen Sie sie manuell, es funktioniert.
Grundsätzlich besteht das Konzept darin, dass die Inhaltsansicht zur Bildlaufansicht passt, die zum sicheren Bereich passt.
Aber als solches hat es nicht funktioniert. Die Inhaltsansicht hat die Höhe verfehlt. Ich habe alles versucht, was ich konnte, und der einzige, der diesen Trick ausführte, war eine Höhe der Inhaltsansicht, die durch Ziehen und Ziehen der Inhaltsansicht zu sich selbst erstellt wurde . Das definierte eine feste Höhe, deren Wert von der Größe des Ansichts-Controllers (definiert als Freiform, länger als die reale Anzeige, bis zum Enthalten aller meiner Unteransichten) berechnet wurde, und schließlich funktionierte es wieder!
quelle
Wenn Sie eine Nachricht (IOS8 / swift) erhalten,
viewDidLayoutSubviews
die nicht vorhanden ist, verwenden Sie stattdessen FolgendesDas hat es für mich behoben
quelle
Etwas, das vorher nicht erwähnt wurde!
Stellen Sie sicher, dass Ihre Steckdose korrekt mit der scrollView verbunden ist! Es sollte einen gefüllten Kreis haben, aber selbst wenn Sie einen gefüllten Kreis haben, ist scrollView möglicherweise nicht verbunden - überprüfen Sie dies also noch einmal! Bewegen Sie den Mauszeiger über den Kreis und prüfen Sie, ob die tatsächliche Bildlaufansicht hervorgehoben wird! (Dies war ein Fall für mich)
quelle
Die meiste Zeit ist der Code korrekt, wenn Sie einem Tutorial gefolgt sind, aber was viele Anfänger nicht wissen, ist, dass die scrollView NICHT normal durch den Simulator scrollen wird. Es wird angenommen, dass Sie nur scrollen, wenn Sie auf das Mauspad drücken und gleichzeitig scrollen. Viele erfahrene XCode / Swift / Obj-C-Benutzer sind daran gewöhnt und wissen nicht, wie dies möglicherweise von Anfängern übersehen werden kann. Ciao :-)
Dieser Code funktioniert einwandfrei, solange Sie das tun, was ich oben gesagt habe
quelle
Wenn keine der anderen Lösungen für Sie funktioniert, überprüfen Sie, ob Ihre Bildlaufansicht tatsächlich ein
UIScrollView
Interface Builder ist.Irgendwann in den letzten Tagen wechselte mein
UIScrollView
Typ spontan zu aUIView
, obwohl seine Klasse diesUIScrollView
im Inspektor sagte . Ich benutzeXcode 5.1 (5B130a)
.Sie können entweder eine neue Bildlaufansicht erstellen und die Messungen, Einstellungen und Einschränkungen aus der alten Ansicht kopieren oder Ihre Ansicht manuell in eine
UIScrollView
in derxib
Datei ändern . Ich habe einen Vergleich durchgeführt und folgende Unterschiede festgestellt:Original:
Nach spontan geändertem Typ:
Also habe ich die
<view>
Leitung durch meine ursprüngliche<scrollView>
Leitung ersetzt.Ich habe auch das Close-Tag der Ansicht
</view>
durch ersetzt</scrollView>
.Stellen Sie sicher, dass die ID mit der aktuellen Ansicht übereinstimmt. In diesem Fall gilt Folgendes: id = "qRn-TP-cXd".
Ich musste auch die xib aus dem Xcode-Cache leeren, indem ich die abgeleiteten Daten der App löschte:
Xcode->Window->Organizer->Projects
Wählen Sie Ihr Projekt aus und klicken Sie in der Zeile Abgeleitete Daten auf Löschen ...Oder wenn Sie ein Gerät verwenden:
Xcode->Window->Organizer->Device
, wählen Sie Ihr Gerät-> Anwendungen, wählen Sie Ihre App, klicken Sie auf (-)Bereinigen Sie nun das Projekt und entfernen Sie die App aus dem Simulator / Gerät:
Xcode->Product->Clean
Simulator/device->press
und halten Sie dasapp->click
(X) gedrückt, um es zu entfernenSie sollten dann in der Lage sein, Ihre App zu erstellen und auszuführen und wieder über Bildlauffunktionen zu verfügen.
PS Ich musste nicht die Inhaltsgröße der
viewDidLayoutSubviews
Bildlaufansicht einstellen oder das automatische Layout deaktivieren, sondern YMMV.quelle
Wenn es sich bei Ihrer
scrollView
Ansicht um eine Unteransicht einescontainerView
bestimmten Typs handelt, stellen Sie sicher, dass SiescrollView
sich innerhalb des Rahmens oder der Grenzen von befindencontainerView
. Ich hatte das,containerView.clipsToBounds = NO
was mir immer noch erlaubte, die scrollView zu sehen, aber weilscrollView
es nicht innerhalb der Grenzen war , konnte ichcontainerView
keine Berührungsereignisse erkennen.Beispielsweise:
Sie können die scrollView sehen, aber es werden keine Benutzerinteraktionen empfangen.
quelle
Das Hinzufügen des folgenden Codes
viewDidLayoutSubviews
hat bei mir mit Autolayout funktioniert. Nachdem Sie alle Antworten ausprobiert haben:quelle
Fügen Sie den
UIScrollViewDelegate
hinzu und fügen Sie den folgenden Code zu derviewDidAppear
Methode hinzu, die für mich behoben wurde.quelle
Mein Problem wurde behoben durch:
Sobald ich die oberen und / oder unteren Einschränkungen entfernt habe, die an den sicheren Bereich und / oder die Übersicht gebunden sind, konnten die Ansichten in der scrollView erneut gescrollt werden und blieben nicht am oberen Rand des Bildschirms fixiert!
Ich hoffe, dies hält jemand anderen von stundenlangen Schmerzen mit diesem speziellen Problem ab.
quelle
Noch ein lustiger Fall:
scrollview.superview.userInteractionEnabled muss true sein
Ich habe mehr als 2 Stunden damit verbracht, dies zu verfolgen, um herauszufinden, dass es sich bei dem übergeordneten Element um UIImageView handelt, das natürlich userInteractionEnabled == false hat
quelle
Nachdem ich mit den Antworten in diesem Thread versagt hatte, stieß ich auf diesen Artikel mit der Lösung.
Es gibt zwei Dinge, die beim Einrichten der Bildlaufansicht mit Autolayout nicht intuitiv sind:
Dies ist der Kern dieses Artikels. Eine vollständige Erklärung, einschließlich Abbildungen, finden Sie hier.
quelle
Ich habe festgestellt, dass bei diesem AutoLayout-Problem ... wenn ich nur die
ViewController
VerwendungUIView
anstelleUIScrollView
der Klasse verwende ... dann füge einfachUIScrollView
selbst ein ... hinzu, dass es funktioniert.quelle
Ich hatte das gleiche Problem in IB.
Nachdem Sie den führenden, nachfolgenden, oberen und unteren Rand der scrollView auf ihre superView gesetzt haben. Ich habe die folgenden Änderungen vorgenommen, um die containerView scrollbar zu machen, was funktioniert hat.
Um die scrollView nur in horizontaler Richtung zu scrollen, nehmen Sie die Einschränkung mit scrollViews centerY = ContainerViews centerY vor
und um es vertikal scrollbar zu machen, machen Sie das centerX von scrollView = das centerX von ContainerView
quelle