2009-06-04 4 views

ответ

544

Вы можете использовать функцию setContentOffset:animated: UIScrollView для прокрутки любой части содержимого. Вот код, который будет прокручивать на дно, предполагается, что ваш Scrollview является self.scrollView:

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

Надежда, что помогает!

+0

спасибо! что помогло. – nico

+0

работает отлично! спасибо –

+0

Приятно, что его работа для меня, а также – user366584

7

я нашел еще один полезный способ сделать это в случае, если вы используете UITableView (который является подклассом UIScrollView):

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

FYI, это только функция UITableView – OhadM

0

Не работает для меня, когда я пытался использовать его в UITableViewController на self.tableView(iOS 4.1), после добавления footerView. Он прокручивается из границ, показывая черный экран.

Альтернативное решение:

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]; 
3

valdyr, надеюсь, что это поможет вам:

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

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

Установка контента смещения на высоту размера содержимого неправильно: она прокручивается в нижней части содержания на сверху вид прокрутки, и, таким образом, вне поля зрения.

Правильное решение для прокрутки в нижней части содержания в нижней части представления прокрутки, как это (sv является 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]; 
} 
+1

Не должно быть 'if (sv.contentOffset.y + csz.height> bsz.height) {'? –

+0

@jeffamaphone - Спасибо, что спросил. На самом деле в этот момент я даже не знаю, в какой цели должно было случиться условие! Это важная команда 'setContentOffset:'. – matt

+0

Я предполагаю, что он избегает вызова setContentOffset, если он ничего не собирается делать? –

5

С (по желанию) 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]; 
+0

Человек, ты бог! – hishamaus

13

Наверх

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

Scroll Вниз

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

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

Добавить это общий заголовок полезной где:

@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]; 
+0

Всегда, всегда, всегда, всегда используйте категории! Perfect :) – Fattie

1

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

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]; 
} 
20

Просто усовершенствование существующего ответа.

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

Он заботится о нижней вставке, а также (в случае, если вы используете что настроить вид прокрутки, когда клавиатура видна)

+0

Большое спасибо, работайте как шарм – Suhaiyl

+0

Это должен быть правильный ответ ... не другие, которые сломаются, если у них когда-нибудь появится клавиатура. –

1

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

[self.scrollView setContentOffset:CGPointMake(0, CGFLOAT_MAX) animated:NO]; 
0
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]; 
44

Простейшее решение:

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

работает как чары .. спасибо за обмен. –

+0

Спасибо. Я забыл, что изменил свой scrollview на UITableView, и этот код также работал с UITableView, FYI. – LevinsonTechnologies

1

В то время как решение 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]; 
} 
59

Swift версия принятого ответа для легкого копирования вставки:

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

О, мы все любим бекон, пиццу и копируем вставку. – Josh

+1

bottomOffset следует указывать, а не var в вашем примере. –

+0

true, изменил его. swift2 stuff :) – Esqarrouth

0

я обнаружил, что contentSize на самом деле не отражают фактический размер текста , поэтому, когда вы пытаетесь прокручивать нижнюю часть, это будет немного немного. Лучший способ для определения фактического размера контента на самом деле использовать NSLayoutManager «s usedRectForTextContainer: метода:

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

Чтобы определить, сколько текста фактически показан в UITextView, вы можете вычислить его путем вычитания текста контейнер врезки из высота рамки.

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

Тогда становится легко прокручивать:

// 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; 

Некоторые номера для справки о том, что представляют разные размеры для пустого UITextView.

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) 
0

В стрижа:

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) 
    } 
5

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

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

Что делать, если contentSize ниже bounds?

Для Swift это:

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

Swifty реализация:

extension UIScrollView { 
    func scrollToBottom(animated 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) 
    } 
} 
+0

@WayneFilkins просто позвоните ему – duan

13

2,2 Раствор Срочное, принимая contentInset во внимание

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

Это должно быть в расширении

extension UIScrollView { 

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

Обратите внимание, что вы можете проверить, если bottomOffset.y > 0 до того свитка

2

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

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) 
} 
Смежные вопросы