Ich habe eine UIView
wie das Sprungbrett des iPhone. Ich habe es mit einer UIScrollView
und einer UIButtons
erstellt. Ich möchte das horizontale Scrollen in dieser Ansicht deaktivieren. Ich möchte nur vertikales Scrollen. Wie mache ich das?
Sie müssen die contentSize
-Eigenschaft von UIScrollView
festlegen. Wenn Ihr UIScrollView
beispielsweise 320 Pixel breit ist (Bildschirmbreite), können Sie Folgendes tun:
CGSize scrollableSize = CGSizeMake(320, myScrollableHeight);
[myScrollView setContentSize:scrollableSize];
Das UIScrollView
scrollt dann nur vertikal, da es bereits alles horizontal anzeigen kann.
AKTUALISIERT: (Nachdem @EranMarom auf seinen Kommentar hingewiesen hat)
Sie können den horizontalen Bildlauf oder den vertikalen Bildlauf stoppen in der ScrollViewDelegate
-Methode . Hier ist, wie,
Stoppt den horizontalen Bildlauf:
Wenn Sie horizontal scrollen möchten, müssen Sie contentOffset.x erhöhen. Dies verhindert, dass der Bildlauf in horizontaler Richtung gescrollt wird.
- (void)scrollViewDidScroll:(UIScrollView *)sender {
sender.contentOffset.x = 0.0
}
Stoppt den vertikalen Bildlauf:
Wenn Sie vertikal scrollen möchten, müssen Sie contentOffset.y erhöhen. Dadurch wird verhindert, dass der Bildlauf in vertikaler Richtung läuft.
- (void)scrollViewDidScroll:(UIScrollView *)sender {
sender.contentOffset.y = 0.0
}
Der obige Code verhindert die Änderungen in x
und y
eines scrollview contentOffset
und führt dazu, dass das Scrollen in der scrollViewDidScroll:
-Methode angehalten wird.
Schnelle Lösung
Erstellen Sie zwei Auslässe, einen für Ihre Ansicht und einen für Ihre Scroll-Ansicht:
@IBOutlet weak var myView: UIView!
@IBOutlet weak var scrollView: UIScrollView!
In Ihren viewDidLayoutSubviews können Sie dann folgenden Code hinzufügen:
let scrollSize = CGSize(width: myView.frame.size.width,
height: myView.frame.size.height)
scrollView.contentSize = scrollSize
Was wir getan haben, ist, die Höhe und Breite der Ansicht zu erfassen und die Inhaltsgröße von scrollViews entsprechend anzupassen. Dadurch wird Ihr Bildlauf nicht mehr horizontal verschoben.
Weitere Gedanken:
CGSizeMake nimmt Breite und Höhe mit CGFloats ein. Möglicherweise müssen Sie die vorhandene Höhe der UIScrollViews für den zweiten Parameter verwenden. Was würde so aussehen:
let scrollSize = CGSize(width: myView.frame.size.width,
height: scrollView.contentSize.height)
seit iOS7 verwenden
self.automaticallyAdjustsScrollViewInsets = NO;
// und erstellen Sie einen 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];
Sie können die Ansicht auswählen und dann unter Attributes Inspector
das Kontrollkästchen User Interaction Enabled
deaktivieren.
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
}
Verwenden Sie diese einzelne Zeile.
self.automaticallyAdjustsScrollViewInsets = NO;
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 das tableview contentInset in viewDidLoad (wie unten) festgelegt, was den horizontalen Bildlauf verursacht
self.tableView.contentInset = UIEdgeInsetsMake(0, 30, 0, 0);
Prüfen Sie, ob ein content_set für TableView-Inhalte aus verschiedenen Gründen festgelegt ist, und deaktivieren Sie sie
Versuche dies:
CGSize scrollSize = CGSizeMake([UIScreen mainScreen].bounds.size.width, scrollHeight);
[scrollView setContentSize: scrollSize];
Nachdem ich das UIScrollView durch ein UITableView mit nur einer Zelle ersetzt hatte, funktionierte es einwandfrei.
Ich hatte einige Zeit damit zu kämpfen und versuchte erfolglos die verschiedenen Vorschläge in diesem und anderen Threads.
In einem anderen Thread (nicht sicher, wo) hat jemand jedoch vorgeschlagen, 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 funktionierte, war, der Scrollansicht führende und nachlaufende Einschränkungen von -32 hinzuzufügen und eine (unsichtbare) Textansicht mit einer Breite von 320 (und zentriert) hinzuzufügen.