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?
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?
Antworten:
Sie müssen die contentSize
Eigenschaft von festlegen UIScrollView
. Wenn Sie UIScrollView
beispielsweise 320 Pixel breit sind (die Breite des Bildschirms), können Sie Folgendes tun:
CGSize scrollableSize = CGSizeMake(320, myScrollableHeight);
[myScrollView setContentSize:scrollableSize];
Der UIScrollView
wird dann nur vertikal scrollen, da er bereits alles horizontal anzeigen kann.
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.
- (void)scrollViewDidScroll:(UIScrollView *)sender {
sender.contentOffset.x = 0.0
}
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.
- (void)scrollViewDidScroll:(UIScrollView *)sender {
sender.contentOffset.y = 0.0
}
Der obige Code verhindert die Änderungen in x
und y
von a scrollview contentOffset
und führt dazu, dass das Scrollen in der scrollViewDidScroll:
Methode gestoppt wird.
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 und scrollView.contentOffset.x = 0.0
das horizontale Scrollen zu stoppen scrollViewDidScroll()
. Ich glaube jedoch, dass es eine bessere (richtige) Lösung ist, sicherzustellen, dass das scrollView.contentSize
Gleiche dem entspricht scrollView.frame.size
. Siehe @ danbeaulieu Antwort.
seit iOS7 verwenden
self.automaticallyAdjustsScrollViewInsets = NO;
// und erstelle deinen Seiten-Scroller mit 3 Seiten
self.pageView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
[self.pageView setContentSize:CGSizeMake(self.view.frame.size.width*3, self.view.frame.size.height)];
[self.pageView setShowsVerticalScrollIndicator:NO];
[self.pageView setPagingEnabled:YES];
[self.view addSubview:self.pageView];
self.collectionView.pagingEnabled = YES;
half mir, das Problem mit dem reibungslosen Scrollen (nicht Ziehen) zu lösen. Das Problem lag in der Methode scrollViewWillEndDragging:
- targetContentOffset war dasselbe wie scrollView.contentOffset und die Seitenerkennungslogik funktioniert nicht richtig.
Schnelle Lösung
Erstellen Sie zwei Steckdosen, eine für Ihre Ansicht und eine für Ihre Bildlaufansicht:
@IBOutlet weak var myView: UIView!
@IBOutlet weak var scrollView: UIScrollView!
Dann können Sie in Ihren viewDidLayoutSubviews den folgenden Code hinzufügen:
let scrollSize = CGSize(width: myView.frame.size.width,
height: myView.frame.size.height)
scrollView.contentSize = scrollSize
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:
let scrollSize = CGSize(width: myView.frame.size.width,
height: scrollView.contentSize.height)
In meinem Fall können Sie mit Swift 4.2 Folgendes verwenden:
Vertikales Scrollen deaktivieren:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollView.contentOffset.y = 0.0
}
Horizontalen Bildlauf deaktivieren:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollView.contentOffset.x = 0.0
}
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
Ich hatte die Tabellenansicht contentInset in viewDidLoad (wie unten) so eingestellt, dass sie das horizontale Scrollen verursacht
self.tableView.contentInset = UIEdgeInsetsMake(0, 30, 0, 0);
Überprüfen Sie, ob aus verschiedenen Gründen eine Tabellenansicht für contentInset festgelegt ist, und deaktivieren Sie diese
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.
In iOS 11 wurde eine neue Eigenschaft eingeführt UIScrollView
var contentLayoutGuide: UILayoutGuide
Die Dokumentation besagt, dass Sie:
Verwenden Sie diese Layoutanleitung, wenn Sie Einschränkungen für das automatische Layout für den Inhaltsbereich einer Bildlaufansicht erstellen möchten.
Zusammen mit anderen Autolayout Einschränkungen , dass Sie Sie wollen vielleicht das Hinzufügen der beschränken widthAnchor
der UIScrollView
‚s contentLayoutGuide
die gleiche Größe sein , wie der‚Rahmen‘. Sie können die frameLayoutGuide
(auch in iOS 11 eingeführte) oder eine beliebige externe Breite (z. B. Ihre) verwendensuperView
) verwenden.
Beispiel:
NSLayoutConstraint.activate([
scrollView.contentLayoutGuide.widthAnchor.constraint(equalTo: self.widthAnchor)
])
Dokumentation: https://developer.apple.com/documentation/uikit/uiscrollview/2865870-contentlayoutguide
Nachdem ich das UIScrollView durch ein UITableView mit nur 1 Zelle ersetzt hatte, funktionierte es einwandfrei.
Verwenden Sie diese einzelne Zeile.
self.automaticallyAdjustsScrollViewInsets = NO;