Ich habe ein UIView
ähnliches iPhone-Sprungbrett. Ich habe es mit einem UIScrollView
und erstellt UIButtons
. Ich möchte das horizontale Scrollen in dieser Bildlaufansicht deaktivieren. Ich möchte nur vertikales Scrollen. Wie schaffe ich das?
ios
objective-c
uiscrollview
Rahul Vyas
quelle
quelle
Antworten:
Sie müssen die
contentSize
Eigenschaft von festlegenUIScrollView
. Wenn SieUIScrollView
beispielsweise 320 Pixel breit sind (die Breite des Bildschirms), können Sie Folgendes tun:Der
UIScrollView
wird dann nur vertikal scrollen, da er bereits alles horizontal anzeigen kann.quelle
AKTUALISIERT: (Nachdem @EranMarom auf seinen Kommentar hingewiesen hat)
Sie können das horizontale oder vertikale Scrollen in der
ScrollViewDelegate
Methode stoppen . Hier ist es wie,Stoppt das horizontale Scrollen:
Wenn Sie horizontal scrollen möchten, müssen Sie contentOffset.x erhöhen. Wenn Sie dies verhindern, wird der Bildlauf in horizontaler Richtung gestoppt.
Stoppt das vertikale Scrollen:
Wenn Sie vertikal scrollen möchten, müssen Sie contentOffset.y erhöhen. Wenn Sie dies verhindern, wird der Bildlauf in vertikaler Richtung gestoppt.
Der obige Code verhindert die Änderungen in
x
undy
von ascrollview contentOffset
und führt dazu, dass das Scrollen in derscrollViewDidScroll:
Methode gestoppt wird.quelle
scrollView.contentOffset = CGPointMake(0, scrollView.contentOffset.y);
horizontale Scrollen zu deaktivieren. Ich finde es besser lesbar, es ist kleiner und es macht keinen Sinn, den Test für Null durchzuführen, da es praktisch keinen Overhead mit Code gibt, der dies selten ausführt (dh maximal einige zehn Mal pro Sekunde).scrollView.contentOffset.y = 0.0
vertikale Scrollen undscrollView.contentOffset.x = 0.0
das horizontale Scrollen zu stoppenscrollViewDidScroll()
. Ich glaube jedoch, dass es eine bessere (richtige) Lösung ist, sicherzustellen, dass dasscrollView.contentSize
Gleiche dem entsprichtscrollView.frame.size
. Siehe @ danbeaulieu Antwort.seit iOS7 verwenden
// und erstelle deinen Seiten-Scroller mit 3 Seiten
quelle
self.collectionView.pagingEnabled = YES;
half mir, das Problem mit dem reibungslosen Scrollen (nicht Ziehen) zu lösen. Das Problem lag in der MethodescrollViewWillEndDragging:
- targetContentOffset war dasselbe wie scrollView.contentOffset und die Seitenerkennungslogik funktioniert nicht richtig.Erstellen Sie zwei Steckdosen, eine für Ihre Ansicht und eine für Ihre Bildlaufansicht:
Dann können Sie in Ihren viewDidLayoutSubviews den folgenden Code hinzufügen:
Wir haben die Höhe und Breite der Ansicht erfasst und die Größe des scrollViews-Inhalts entsprechend festgelegt. Dadurch wird verhindert, dass Ihre Bildlaufansicht horizontal gescrollt wird.
Weitere Gedanken:
CGSizeMake nimmt mit CGFloats eine Breite und Höhe an. Möglicherweise müssen Sie die vorhandene Höhe Ihrer UIScrollViews für den zweiten Parameter verwenden. Welches würde so aussehen:
quelle
In meinem Fall können Sie mit Swift 4.2 Folgendes verwenden:
Vertikales Scrollen deaktivieren:
Horizontalen Bildlauf deaktivieren:
quelle
Sie können die Ansicht auswählen und dann
Attributes Inspector
deaktivierenUser Interaction Enabled
.quelle
In meinem Fall war die Breite von contentView größer als die Breite von UIScrollView und dies war der Grund für unerwünschtes horizontales Scrollen. Ich habe es gelöst, indem ich die Breite von contentView gleich der Breite von UIScrollView gesetzt habe.
Hoffe es hilft jemandem
quelle
Ich hatte die Tabellenansicht contentInset in viewDidLoad (wie unten) so eingestellt, dass sie das horizontale Scrollen verursacht
Überprüfen Sie, ob aus verschiedenen Gründen eine Tabellenansicht für contentInset festgelegt ist, und deaktivieren Sie diese
quelle
Ich hatte einige Zeit damit zu kämpfen und versuchte erfolglos, die verschiedenen Vorschläge in diesem und anderen Threads zu machen.
In einem anderen Thread (nicht sicher, wo) schlug jemand vor, dass die Verwendung einer negativen Einschränkung für UIScrollView für ihn funktioniert.
Also habe ich verschiedene Kombinationen von Einschränkungen mit inkonsistenten Ergebnissen ausprobiert. Was schließlich für mich funktioniert hat, war, der Bildlaufansicht führende und nachfolgende Einschränkungen von -32 hinzuzufügen und eine (unsichtbare) Textansicht mit einer Breite von 320 (und zentriert) hinzuzufügen.
quelle
Versuche dies:
quelle
Deaktivieren Sie das horizontale Scrollen, indem Sie die
contentOffset
Eigenschaft in der Unterklasse überschreiben .quelle
In iOS 11 wurde eine neue Eigenschaft eingeführt
UIScrollView
Die Dokumentation besagt, dass Sie:
Zusammen mit anderen Autolayout Einschränkungen , dass Sie Sie wollen vielleicht das Hinzufügen der beschränken
widthAnchor
derUIScrollView
‚scontentLayoutGuide
die gleiche Größe sein , wie der‚Rahmen‘. Sie können dieframeLayoutGuide
(auch in iOS 11 eingeführte) oder eine beliebige externe Breite (z. B. Ihre) verwendensuperView
) verwenden.Beispiel:
Dokumentation: https://developer.apple.com/documentation/uikit/uiscrollview/2865870-contentlayoutguide
quelle
Nachdem ich das UIScrollView durch ein UITableView mit nur 1 Zelle ersetzt hatte, funktionierte es einwandfrei.
quelle
Verwenden Sie diese einzelne Zeile.
self.automaticallyAdjustsScrollViewInsets = NO;
quelle