UIScrollView прокрутить вниз программно - PullRequest
271 голосов
/ 04 июня 2009

Как я могу сделать UIScrollView прокрутку вниз в моем коде? Или в более общем виде, в любой точке подпредставления?

Ответы [ 24 ]

6 голосов
/ 15 января 2016

Использование функции UIScrollView setContentOffset:animated: для прокрутки вниз в Swift.

let bottomOffset : CGPoint = CGPointMake(0, scrollView.contentSize.height - scrollView.bounds.size.height + scrollView.contentInset.bottom)
scrollView.setContentOffset(bottomOffset, animated: true)
5 голосов
/ 28 января 2012

С (необязательным) footerView и contentInset решение:

CGPoint bottomOffset = CGPointMake(0, _tableView.contentSize.height - tableView.frame.size.height + _tableView.contentInset.bottom);
if (bottomOffset.y > 0) [_tableView setContentOffset: bottomOffset animated: YES];
3 голосов
/ 29 октября 2010

Валдыр, надеюсь, это вам поможет:

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

if (bottomOffset.y > 0)
 [textView setContentOffset: bottomOffset animated: YES];
2 голосов
/ 14 марта 2013

Категория на помощь!

Добавьте это к общему заголовку утилиты где-нибудь:

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

А затем к реализации этой утилиты:

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

Затем реализуйте его, где хотите, например:

[[myWebView scrollView] scrollToBottomAnimated:YES];
1 голос
/ 16 января 2014

Если вам не нужна анимация, это работает:

[self.scrollView setContentOffset:CGPointMake(0, CGFLOAT_MAX) animated:NO];
1 голос
/ 27 марта 2013

Хороший способ обеспечить видимость нижней части вашего контента - использовать формулу:

contentOffsetY = MIN(0, contentHeight - boundsHeight)

Это гарантирует, что нижний край вашего контента всегда находится у нижнего края представления или над ним. MIN(0, ...) требуется, потому что UITableView (и, вероятно, UIScrollView) обеспечивает contentOffsetY >= 0, когда пользователь пытается прокрутить, визуально щелкая contentOffsetY = 0. Это выглядит довольно странно для пользователя.

Код для реализации этого:

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];
}
1 голос
/ 17 июня 2014

В то время как Matt решение кажется мне правильным, вам необходимо принять во внимание также вкладку вида коллекции, если она есть.

Адаптированный код будет:

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];
}
1 голос
/ 28 февраля 2017

Решение для прокрутки до последнего элемента таблицы Вид:

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)
}
0 голосов
/ 10 августа 2018

Xamarin.iOS версия для UICollectionView принятого ответа для простоты копирования и вставки

var bottomOffset = new CGPoint (0, CollectionView.ContentSize.Height - CollectionView.Frame.Size.Height + CollectionView.ContentInset.Bottom);          
CollectionView.SetContentOffset (bottomOffset, false);
0 голосов
/ 10 августа 2018

Xamarin.iOS версия принятого ответа

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

scrollView.SetContentOffset (bottomOffset, false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...