24 ответов:
вы можете использовать UIScrollView в
setContentOffset:animated:функция для прокрутки до любой части представления содержимого. Вот некоторый код, который будет прокручиваться вниз, предполагая, что ваш scrollViewself.scrollView:CGPoint bottomOffset = CGPointMake(0, self.scrollView.contentSize.height - self.scrollView.bounds.size.height); [self.scrollView setContentOffset:bottomOffset animated:YES];надеюсь, что это поможет!
Swift версия принятого ответа для легкого копирования вставки:
let bottomOffset = CGPoint(x: 0, y: scrollView.contentSize.height - scrollView.bounds.size.height) scrollView.setContentOffset(bottomOffset, animated: true)
Самое Простое Решение:
[scrollview scrollRectToVisible:CGRectMake(scrollview.contentSize.width - 1,scrollview.contentSize.height - 1, 1, 1) animated:YES];
просто улучшение существующего ответа.
CGPoint bottomOffset = CGPointMake(0, self.scrollView.contentSize.height - self.scrollView.bounds.size.height + self.scrollView.contentInset.bottom); [self.scrollView setContentOffset:bottomOffset animated:YES];Он также заботится о нижней вставке (в случае, если вы используете ее для настройки вида прокрутки, когда клавиатура видна)
установка смещения содержимого на высоту размера содержимого неверна: он прокручивает нижнюю часть содержимого до top из вида прокрутки, и, таким образом, из поля зрения.
правильное решение-прокрутить нижнюю часть содержимого до дно из вида прокрутки, как это (
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]; }
быстрое решение 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прежде чем свиток
Наверх
- CGPoint topOffset = CGPointMake(0, 0); - [scrollView setContentOffset:topOffset animated:YES];В Самом Низу
- CGPoint bottomOffset = CGPointMake(0, scrollView.contentSize.height - self.scrollView.bounds.size.height); - [scrollView setContentOffset:bottomOffset animated:YES];
быстрая реализация:
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) } }вы называете расширение следующим образом:
yourScrollview.scrollToBottom(animated: true)
, что если
contentSizeменьшеbounds?для Swift это:
scrollView.setContentOffset(CGPointMake(0, max(scrollView.contentSize.height - scrollView.bounds.size.height, 0) ), animated: true)
Я нашла еще один полезный способ сделать это в случае, если вы используете UITableview (который является подклассом UIScrollView):
[(UITableView *)self.view scrollToRowAtIndexPath:scrollIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
используя UIScrollView
setContentOffset:animated:функция для прокрутки вниз в Swift.let bottomOffset : CGPoint = CGPointMake(0, scrollView.contentSize.height - scrollView.bounds.size.height + scrollView.contentInset.bottom) scrollView.setContentOffset(bottomOffset, animated: true)
С (опционально) 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];
valdyr, надеюсь это поможет вам:
CGPoint bottomOffset = CGPointMake(0, [textView contentSize].height - textView.frame.size.height); if (bottomOffset.y > 0) [textView setContentOffset: bottomOffset animated: YES];
категория на помощь!
добавьте это в заголовок общей утилиты где-нибудь:
@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];
хороший способ обеспечить видимость нижней части вашего контента-использовать формулу:
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]; }
Если вам не нужна анимация, это работает:
[self.scrollView setContentOffset:CGPointMake(0, CGFLOAT_MAX) animated:NO];
пока
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]; }
решение для прокрутки до последнего элемента табличного представления:
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) }
не работает для меня, когда я попытался использовать его в
UITableViewControlleronself.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];
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];
Я нашел это
contentSizeна самом деле не отражает фактический размер текста, поэтому при попытке прокрутки вниз он будет немного выключен. Лучший способ определить фактический размер контента-это использоватьNSLayoutManager' susedRectForTextContainer:способ: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)
в 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) }
Xamarin.прошивкой версия принятого ответа
var bottomOffset = new CGPoint (0, scrollView.ContentSize.Height - scrollView.Frame.Size.Height + scrollView.ContentInset.Bottom); scrollView.SetContentOffset (bottomOffset, false);
Xamarin.прошивкой версия
UICollectionViewпринятого ответа для удобства копирования и вставкиvar bottomOffset = new CGPoint (0, CollectionView.ContentSize.Height - CollectionView.Frame.Size.Height + CollectionView.ContentInset.Bottom); CollectionView.SetContentOffset (bottomOffset, false);
Comments