Как я могу сделать прокрутку UIScrollView
в нижней части моего кода? Или более общим образом, в любую точку подсмотра?
UIScrollView прокручивается вниз программно
Ответ 1
Вы можете использовать UIScrollView setContentOffset:animated:
функцию для прокрутки к любой части представления содержимого. Вот некоторый код, который будет прокручиваться вниз, предполагая, что ваш scrollView - это 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];
Надеюсь, это поможет!
Ответ 2
Быстрая версия принятого ответа для легкого копирования:
let bottomOffset = CGPoint(x: 0, y: scrollView.contentSize.height - scrollView.bounds.size.height)
scrollView.setContentOffset(bottomOffset, animated: true)
Ответ 3
Простейшее решение:
[scrollview scrollRectToVisible:CGRectMake(scrollview.contentSize.width - 1,scrollview.contentSize.height - 1, 1, 1) animated:YES];
Ответ 4
Просто улучшение существующего ответа.
CGPoint bottomOffset = CGPointMake(0, self.scrollView.contentSize.height - self.scrollView.bounds.size.height + self.scrollView.contentInset.bottom);
[self.scrollView setContentOffset:bottomOffset animated:YES];
Он также заботится о нижней вставке (в случае, если вы используете это, чтобы настроить вид прокрутки, когда клавиатура видна)
Ответ 5
Настройка смещения содержимого на высоту размера содержимого неверна: он прокручивает нижнюю часть содержимого вверху списка прокрутки и, таким образом, скрывается из виду.
Правильное решение - прокрутить нижнюю часть содержимого до нижней части прокрутки, например (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];
}
Ответ 6
Решение Swift 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
перед прокруткой
Ответ 7
Быстрая реализация:
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)
Ответ 8
Прокрутите вверх
- 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];
Ответ 9
Что делать, если contentSize
ниже bounds
?
Для Swift это:
scrollView.setContentOffset(CGPointMake(0, max(scrollView.contentSize.height - scrollView.bounds.size.height, 0) ), animated: true)
Ответ 10
Я также нашел еще один полезный способ сделать это в том случае, если вы используете UITableview (который является подклассом UIScrollView):
[(UITableView *)self.view scrollToRowAtIndexPath:scrollIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
Ответ 11
Использование функции UIScrollView setContentOffset:animated:
для прокрутки вниз в Swift.
let bottomOffset : CGPoint = CGPointMake(0, scrollView.contentSize.height - scrollView.bounds.size.height + scrollView.contentInset.bottom)
scrollView.setContentOffset(bottomOffset, animated: true)
Ответ 12
С помощью (необязательного) 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];
Ответ 13
valdyr, надеюсь, это поможет вам:
CGPoint bottomOffset = CGPointMake(0, [textView contentSize].height - textView.frame.size.height);
if (bottomOffset.y > 0)
[textView setContentOffset: bottomOffset animated: YES];
Ответ 14
Категория на помощь!
Добавьте это в общий заголовок утилиты где-нибудь:
@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];
Ответ 15
Похоже, что все ответы здесь не приняли во внимание безопасную область.
Начиная с iOS 11, в iPhone X появилась безопасная зона. Это может повлиять на scrollView contentInset
.
Для iOS 11 и выше, для правильной прокрутки вниз с включенным содержимым. Вы должны использовать adjustedContentInset
вместо contentInset
. Проверьте этот код:
- 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];
- Быстрое расширение (при этом сохраняется оригинал
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)
}
}
Ссылки:
Ответ 16
Хорошим способом обеспечения нижней части вашего содержимого является использование формулы:
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];
}
Ответ 17
Если вам не нужна анимация, это работает:
[self.scrollView setContentOffset:CGPointMake(0, CGFLOAT_MAX) animated:NO];
Ответ 18
В то время как решение 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];
}
Ответ 19
В быстрой:
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)
}
Ответ 20
Решение для прокрутки до последнего элемента таблицы Вид:
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)
}
Ответ 21
Не работал у меня, когда я пытался использовать его в 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];
Ответ 22
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];
Ответ 23
Я обнаружил, что contentSize
на самом деле не отражает фактический размер текста, поэтому при попытке прокрутки донизу он будет немного отключен. Лучший способ определить фактический размер содержимого - это использовать метод NSLayoutManager
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)
Ответ 24
Для горизонтального ScrollView
Если вы мне нравитесь, у вас есть объект Horizontal ScrollView, и вы хотите прокрутить его до конца (в моем случае до самого правого), вам нужно изменить некоторые части принятого ответа:
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];
стриж
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)
Ответ 25
Xamarin.iOS версия принятого ответа
var bottomOffset = new CGPoint (0,
scrollView.ContentSize.Height - scrollView.Frame.Size.Height
+ scrollView.ContentInset.Bottom);
scrollView.SetContentOffset (bottomOffset, false);
Ответ 26
Версия Xamarin.iOS для UICollectionView
принятого ответа для простоты копирования и вставки
var bottomOffset = new CGPoint (0, CollectionView.ContentSize.Height - CollectionView.Frame.Size.Height + CollectionView.ContentInset.Bottom);
CollectionView.SetContentOffset (bottomOffset, false);