Frage

Wie kann ich eine UIScrollView scrollen Sie nach unten in meinem Code? Oder in eine allgemeinere Art und Weise, zu jedem Punkt eines subview?

War es hilfreich?

Lösung

Sie können die setContentOffset:animated: Funktion des UIScrollView verwenden, um einen Teil des Inhalts Ansicht zu scrollen. Hier einige Code, der nach unten scrollen würde, vorausgesetzt, Ihr Scrollview ist self.scrollView:

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

Ich hoffe, das hilft!

Andere Tipps

Swift Version der akzeptierten Antwort für eine einfache Kopie einfügen:

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

Einfachste Lösung:

[scrollview scrollRectToVisible:CGRectMake(scrollview.contentSize.width - 1,scrollview.contentSize.height - 1, 1, 1) animated:YES];

Nur eine Erweiterung der bestehenden Antwort.

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

Es kümmert sich um den unteren Einschub als auch (falls Sie das verwenden Ihre Scroll-Ansicht anzupassen, wenn die Tastatur sichtbar ist)

Einstellen der Inhalte auf die Höhe des Inhalts Größe versetzt ist falsch. Er den Boden des Inhalts scrollt auf die oben der Scroll-Ansicht, und damit aus Sicht

Die richtige Lösung ist, den Boden des Inhalts an die unten der Scroll-Ansicht zu scrollen, wie diese (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];
}

A Swift 2.2 Lösung, contentInset Berücksichtigung

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

Dies in einer Erweiterung sein sollte

extension UIScrollView {

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

Beachten Sie, dass, wenn bottomOffset.y > 0 möchten vor blättern Sie, um

Eine swifty Implementierung:

extension UIScrollView {
   func scrollToBottom(animated: Bool) {
     if self.contentSize.height < self.bounds.size.height { return }
     let bottomOffset = CGPoint(x: 0, y: self.contentSize.height - self.bounds.size.height)
     self.setContentOffset(bottomOffset, animated: animated)
  }
}

verwenden es:

yourScrollview.scrollToBottom(animated: true)

Scrollen nach oben

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

Rolle zum Ende

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

Was passiert, wenn contentSize niedriger als bounds ist?

Für Swift ist:

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

Ich fand auch eine andere nützliche Möglichkeit, dies im Fall tun Sie ein UITableView verwenden (die eine Unterklasse von UIScrollView ist):

[(UITableView *)self.view scrollToRowAtIndexPath:scrollIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];

UIScrollView die setContentOffset:animated: Funktion kann auf die Unterseite in Swift blättern.

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

Mit einem (optional) footerView und contentInset, die Lösung ist:

CGPoint bottomOffset = CGPointMake(0, _tableView.contentSize.height - tableView.frame.size.height + _tableView.contentInset.bottom);
if (bottomOffset.y > 0) [_tableView setContentOffset: bottomOffset animated: YES];

valdyr, hoffe, dies wird Ihnen helfen:

CGPoint bottomOffset = CGPointMake(0, [textView contentSize].height - textView.frame.size.height);

if (bottomOffset.y > 0)
 [textView setContentOffset: bottomOffset animated: YES];

Kategorie zur Rettung!

Fügen Sie diese auf einem gemeinsamen Dienstprogramm Header irgendwo:

@interface UIScrollView (ScrollToBottom)
- (void)scrollToBottomAnimated:(BOOL)animated;
@end

Und dann zu diesem Dienstprogramm Implementierung:

@implementation UIScrollView(ScrollToBottom)
- (void)scrollToBottomAnimated:(BOOL)animated
{
     CGPoint bottomOffset = CGPointMake(0, self.contentSize.height - self.bounds.size.height);
     [self setContentOffset:bottomOffset animated:animated];
}
@end

Dann implementieren es wo immer Sie wollen, zum Beispiel:

[[myWebView scrollView] scrollToBottomAnimated:YES];

Eine gute Möglichkeit, die Unterseite des Inhalts sichtbar ist, um sicherzustellen, ist die Formel zu verwenden:

contentOffsetY = MIN(0, contentHeight - boundsHeight)

Damit wird sichergestellt, der untere Rand Ihrer Inhalte immer auf oder über dem unteren Rand der Ansicht ist. Die MIN(0, ...) ist erforderlich, weil UITableView (und wahrscheinlich UIScrollView) sorgt für contentOffsetY >= 0, wenn der Benutzer durch sichtbar Schnappen contentOffsetY = 0 zu bewegen versucht. Das sieht ziemlich komisch an den Benutzer.

Der Code, dies zu implementieren ist:

UIScrollView scrollView = ...;
CGSize contentSize = scrollView.contentSize;
CGSize boundsSize = scrollView.bounds.size;
if (contentSize.height > boundsSize.height)
{
    CGPoint contentOffset = scrollView.contentOffset;
    contentOffset.y = contentSize.height - boundsSize.height;
    [scrollView setContentOffset:contentOffset animated:YES];
}

Wenn Sie keine Animation benötigen, das funktioniert:

[self.scrollView setContentOffset:CGPointMake(0, CGFLOAT_MAX) animated:NO];

Während Matt Lösung scheint richtig zu mir, Sie in Betracht ziehen müssen auch die Sammlung Ansicht Einsatz, wenn es eines, das Set-up ist.

Der angepasste Code wird sein:

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

In swift:

   if self.mainScroll.contentSize.height > self.mainScroll.bounds.size.height {
        let bottomOffset = CGPointMake(0, self.mainScroll.contentSize.height - self.mainScroll.bounds.size.height);
        self.mainScroll.setContentOffset(bottomOffset, animated: true)
    }

Lösung zum letzten Elemente einer Tabelle anzeigen blättern:

Swift 3:

if self.items.count > 0 {
        self.tableView.scrollToRow(at:  IndexPath.init(row: self.items.count - 1, section: 0), at: UITableViewScrollPosition.bottom, animated: true)
}

Hat nicht funktioniert für mich, als ich versuchte, es in UITableViewController auf self.tableView (iOS 4.1) zu verwenden, nach footerView Zugabe. Es rollt aus den Grenzen, schwarzen Bildschirm.

Alternative Lösung:

 CGFloat height = self.tableView.contentSize.height; 

 [self.tableView setTableFooterView: myFooterView];
 [self.tableView reloadData];

 CGFloat delta = self.tableView.contentSize.height - height;
 CGPoint offset = [self.tableView contentOffset];
 offset.y += delta;

 [self.tableView setContentOffset: offset animated: YES];
CGFloat yOffset = scrollView.contentOffset.y;

CGFloat height = scrollView.frame.size.height;

CGFloat contentHeight = scrollView.contentSize.height;

CGFloat distance = (contentHeight  - height) - yOffset;

if(distance < 0)
{
    return ;
}

CGPoint offset = scrollView.contentOffset;

offset.y += distance;

[scrollView setContentOffset:offset animated:YES];

fand ich, dass contentSize nicht wirklich die tatsächliche Größe des Textes reflektieren, so dass, wenn nach unten zu scrollen versuchen, wird es ein wenig aus sein. Der beste Weg, die tatsächlichen Inhalt Größe zu bestimmen, ist tatsächlich die NSLayoutManager der usedRectForTextContainer: Methode zu verwenden:

UITextView *textView;
CGSize textSize = [textView.layoutManager usedRectForTextContainer:textView.textContainer].size;

Um zu bestimmen, wie viel Text tatsächlich in der UITextView angezeigt wird, können Sie es berechnen, indem Sie die Textcontainer Einsätze von der Rahmenhöhe subtrahiert wird.

UITextView *textView;
UIEdgeInsets textInsets = textView.textContainerInset;
CGFloat textViewHeight = textView.frame.size.height - textInsets.top - textInsets.bottom;

Dann wird es einfach zu blättern:

// if you want scroll animation, use contentOffset
UITextView *textView;
textView.contentOffset = CGPointMake(textView.contentOffset.x, textSize - textViewHeight);

// if you don't want scroll animation
CGRect scrollBounds = textView.bounds;
scrollBounds.origin = CGPointMake(textView.contentOffset.x, textSize - textViewHeight);
textView.bounds = scrollBounds;

Einige Zahlen als Referenz auf, was die verschiedenen Größen für einen leeren UITextView darstellen.

textView.frame.size = (width=246, height=50)
textSize = (width=10, height=16.701999999999998)
textView.contentSize = (width=246, height=33)
textView.textContainerInset = (top=8, left=0, bottom=8, right=0)

für horizontalen Scroll

Wenn Sie möchten, eine horizontale Scrollview und wollen blättern davon zu beenden (in meinem Fall ganz rechts davon), müssen Sie einige Teile der akzeptierte Antwort ändern:

Objective-C

CGPoint rightOffset = CGPointMake(self.scrollView.contentSize.width - self.scrollView.bounds.size.width + self.scrollView.contentInset.right, 0 );
[self.scrollView setContentOffset:rightOffset animated:YES];

Swift

let rightOffset: CGPoint = CGPoint(x: self.scrollView.contentSize.width - self.scrollView.bounds.size.width + self.scrollView.contentInset.right, y: 0)
self.scrollView.setContentOffset(rightOffset, animated: true)

Es sieht aus wie alle Antworten hier nicht den sicheren Bereich berücksichtigen hat. Seit iOS 11, hatte iPhone X einen sicheren Bereich eingeführt. Dies kann die Scroll der contentInset beeinflussen.

Für iOS 11 und oben zu scrollen, um richtig auf den Boden mit dem Inhalt Einsatz enthalten. Sie sollten adjustedContentInset statt contentInset verwenden. Überprüfen Sie diesen Code ein:

  • Swift:
let bottomOffset = CGPoint(x: 0, y: scrollView.contentSize.height - scrollView.bounds.height + scrollView.adjustedContentInset.bottom)
scrollView.setContentOffset(bottomOffset, animated: true)
  • Objective-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 (dies hält 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:

Xamarin.iOS Version akzeptierte Antwort

var bottomOffset = new CGPoint (0,
     scrollView.ContentSize.Height - scrollView.Frame.Size.Height
     + scrollView.ContentInset.Bottom);

scrollView.SetContentOffset (bottomOffset, false);

Xamarin.iOS Version für UICollectionView der akzeptierten Antwort für eine einfache Kopieren und Einfügen

var bottomOffset = new CGPoint (0, CollectionView.ContentSize.Height - CollectionView.Frame.Size.Height + CollectionView.ContentInset.Bottom);          
CollectionView.SetContentOffset (bottomOffset, false);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top