342 Stimmen

UIScrollView programmatisch nach unten scrollen

Wie kann ich eine UIScrollView in meinem Code nach unten scrollen? Oder, allgemeiner ausgedrückt, zu einem beliebigen Punkt einer Unteransicht?

19voto

matt Punkte 481428

Die Einstellung des Inhalts-Offsets auf die Höhe der Inhaltsgröße ist falsch: es scrollt den unteren Rand des Inhalts auf die top der Bildlaufansicht und damit außer Sichtweite.

Die richtige Lösung besteht darin, den unteren Teil des Inhalts bis zum unten der Bildlaufansicht, etwa so ( sv ist die UIScrollView):

CGSize csz = sv.contentSize;
CGSize bsz = sv.bounds.size;
if (sv.contentOffset.y + bsz.height > csz.height) {
    [sv setContentOffset:CGPointMake(sv.contentOffset.x, 
                                     csz.height - bsz.height) 
                animated:YES];
}

16voto

onmyway133 Punkte 42296

Eine Swift 2.2-Lösung, die contentInset zu berücksichtigen

let bottomOffset = CGPoint(x: 0, y: scrollView.contentSize.height - scrollView.bounds.size.height + scrollView.contentInset.bottom)
scrollView.setContentOffset(bottomOffset, animated: true)

Dies sollte in einer Erweiterung erfolgen

extension UIScrollView {

  func scrollToBottom() {
    let bottomOffset = CGPoint(x: 0, y: contentSize.height - bounds.size.height + contentInset.bottom)
    setContentOffset(bottomOffset, animated: true)
  }
}

Beachten Sie, dass Sie prüfen sollten, ob bottomOffset.y > 0 vor dem Scrollen

15voto

Was wäre, wenn contentSize niedriger ist als bounds ?

Für Swift ist es das:

scrollView.setContentOffset(CGPointMake(0, max(scrollView.contentSize.height - scrollView.bounds.size.height, 0) ), animated: true)

13voto

Tahir Waseem Punkte 141

Nach oben scrollen

- CGPoint topOffset = CGPointMake(0, 0);
- [scrollView setContentOffset:topOffset animated:YES];

Nach unten blättern

- CGPoint bottomOffset = CGPointMake(0, scrollView.contentSize.height - self.scrollView.bounds.size.height);
 - [scrollView setContentOffset:bottomOffset animated:YES];

11voto

Honghao Zhang Punkte 1239

Es sieht so aus, als hätten alle Antworten hier den sicheren Bereich nicht berücksichtigt. Seit iOS 11 wurde für das iPhone X ein sicherer Bereich eingeführt. Dies kann die scrollView's beeinflussen contentInset .

Für iOS 11 und höher, um richtig nach unten zu scrollen und den Inhalt einzuschließen. Sie sollten verwenden adjustedContentInset anstelle von contentInset . Prüfen Sie diesen Code:

  • Schnell:

    let bottomOffset = CGPoint(x: 0, y: scrollView.contentSize.height - scrollView.bounds.height + scrollView.adjustedContentInset.bottom) scrollView.setContentOffset(bottomOffset, animated: true)

  • Objektiv-C

    CGPoint bottomOffset = CGPointMake(0, self.scrollView.contentSize.height - self.scrollView.bounds.size.height + self.scrollView.adjustedContentInset.bottom); [self.scrollView setContentOffset:bottomOffset animated:YES];

  • Swift-Erweiterung (dadurch bleibt die ursprüngliche contentOffset.x ):

    extension UIScrollView { func scrollsToBottom(animated: Bool) { let bottomOffset = CGPoint(x: contentOffset.x, y: contentSize.height - bounds.height + adjustedContentInset.bottom) setContentOffset(bottomOffset, animated: animated) } }

Referenzen:

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X