Как я могу сделать UIScrollView
прокрутку вниз в моем коде? Или в более общем виде, в любой точке подсмотра?UIScrollView прокручивается вниз программно
ответ
Вы можете использовать функцию 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];
Надежда, что помогает!
я нашел еще один полезный способ сделать это в случае, если вы используете UITableView (который является подклассом UIScrollView):
[(UITableView *)self.view scrollToRowAtIndexPath:scrollIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
FYI, это только функция UITableView – OhadM
Не работает для меня, когда я пытался использовать его в 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];
valdyr, надеюсь, что это поможет вам:
CGPoint bottomOffset = CGPointMake(0, [textView contentSize].height - textView.frame.size.height);
if (bottomOffset.y > 0)
[textView setContentOffset: bottomOffset animated: YES];
Установка контента смещения на высоту размера содержимого неправильно: она прокручивается в нижней части содержания на сверху вид прокрутки, и, таким образом, вне поля зрения.
Правильное решение для прокрутки в нижней части содержания в нижней части представления прокрутки, как это (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];
}
Не должно быть 'if (sv.contentOffset.y + csz.height> bsz.height) {'? –
@jeffamaphone - Спасибо, что спросил. На самом деле в этот момент я даже не знаю, в какой цели должно было случиться условие! Это важная команда 'setContentOffset:'. – matt
Я предполагаю, что он избегает вызова setContentOffset, если он ничего не собирается делать? –
С (по желанию) 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];
Человек, ты бог! – hishamaus
Наверх
- 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];
Категория на помощь!
Добавить это общий заголовок полезной где:
@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];
Всегда, всегда, всегда, всегда используйте категории! Perfect :) – Fattie
Хорошим способом обеспечения нижней части вашего содержимого является использование формулы:
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];
}
Просто усовершенствование существующего ответа.
CGPoint bottomOffset = CGPointMake(0, self.scrollView.contentSize.height - self.scrollView.bounds.size.height + self.scrollView.contentInset.bottom);
[self.scrollView setContentOffset:bottomOffset animated:YES];
Он заботится о нижней вставке, а также (в случае, если вы используете что настроить вид прокрутки, когда клавиатура видна)
Большое спасибо, работайте как шарм – Suhaiyl
Это должен быть правильный ответ ... не другие, которые сломаются, если у них когда-нибудь появится клавиатура. –
Если вам не нужна анимация, это работает:
[self.scrollView setContentOffset:CGPointMake(0, CGFLOAT_MAX) animated:NO];
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];
Простейшее решение:
[scrollview scrollRectToVisible:CGRectMake(scrollview.contentSize.width - 1,scrollview.contentSize.height - 1, 1, 1) animated:YES];
работает как чары .. спасибо за обмен. –
Спасибо. Я забыл, что изменил свой scrollview на UITableView, и этот код также работал с UITableView, FYI. – LevinsonTechnologies
В то время как решение 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 версия принятого ответа для легкого копирования вставки:
let bottomOffset = CGPoint(x: 0, y: scrollView.contentSize.height - scrollView.bounds.size.height)
scrollView.setContentOffset(bottomOffset, animated: true)
О, мы все любим бекон, пиццу и копируем вставку. – Josh
bottomOffset следует указывать, а не var в вашем примере. –
true, изменил его. swift2 stuff :) – Esqarrouth
я обнаружил, что 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)
В стрижа:
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)
}
Использование setContentOffset:animated:
функции UIScrollView для прокрутки на дно в Swift.
let bottomOffset : CGPoint = CGPointMake(0, scrollView.contentSize.height - scrollView.bounds.size.height + scrollView.contentInset.bottom)
scrollView.setContentOffset(bottomOffset, animated: true)
Что делать, если contentSize
ниже bounds
?
Для Swift это:
scrollView.setContentOffset(CGPointMake(0, max(scrollView.contentSize.height - scrollView.bounds.size.height, 0)), animated: true)
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)
}
}
@WayneFilkins просто позвоните ему – duan
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
до того свитка
Решения для перехода к последнему пункту таблицы Вида:
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)
}
- 1. UIScrollView не прокручивается на устройстве
- 2. UIScrollView: ничего не прокручивается
- 3. iOS: UIScrollView не прокручивается вниз до нижнего уровня его подзонов
- 4. UIScrollView не прокручивается в iPAD
- 5. Контроллер UIScrollView не полностью прокручивается
- 6. UIScrollView не прокручивается в ios6
- 7. UIScrollView не прокручивается?
- 8. UIScrollview не прокручивается
- 9. UIScrollView не прокручивается вообще
- 10. UIScrollView не прокручивается наверх
- 11. UIScrollView не прокручивается вообще
- 12. UIScrollView не прокручивается гладко?
- 13. UIScrollView прокручивается неожиданный
- 14. UIScrollView- Как далеко прокручивается?
- 15. UIScrollVIew не прокручивается
- 16. UIScrollView не прокручивается вообще при добавлении программно в Swift?
- 17. UIScrollView не прокручивается с автозапуском (размер кадра содержимого изменен программно)
- 18. Программно прокрутите UIScrollView
- 19. Как определить, когда строка UIActionSheet прокручивается вниз?
- 20. UIView в UIScrollView не прокручивается
- 21. UITableView не прокручивается внутри UIScrollView
- 22. UIScrollView не прокручивается должным образом
- 23. UIScrollView не прокручивается в Xcode6
- 24. UIScrollView в UIViewController не прокручивается
- 25. UIScrollView не прокручивается до конца?
- 26. UIScrollView не прокручивается с uiview
- 27. UIScrollView не прокручивается должным образом.
- 28. xcode UIScrollview не прокручивается плавно
- 29. CAGradientLayer прокручивается с помощью UIScrollView
- 30. UIScrollView не прокручивается в UiView
спасибо! что помогло. – nico
работает отлично! спасибо –
Приятно, что его работа для меня, а также – user366584