Получение текущей страницы
В моем представлении прокрутки я хочу, чтобы отображалась текущая страница (возможно, страница не является правильной терминологией). Я не могу найти переменную, которая содержит это. Но я думаю, что это должно быть где-то где-то, так как индикатор может показать, какой под просмотр представлений прокрутки отображается в настоящее время.
Это скрыто от нас полностью или есть способ получить к нему доступ?
Ответы
Ответ 1
Для текущей страницы нет свойства UIScrollView
. Вы можете рассчитать его с помощью:
int page = scrollView.contentOffset.x / scrollView.frame.size.width;
Если вы хотите округлить вверх или вниз до ближайшей страницы, используйте:
CGFloat width = scrollView.frame.size.width;
NSInteger page = (scrollView.contentOffset.x + (0.5f * width)) / width;
Ответ 2
Я очень рекомендую вам использовать этот код
int indexOfPage = scrollView.contentOffset.x / scrollView.frame.size.width;
но если вы используете этот код, ваше представление не обязательно должно быть точно на странице, которую дает вам indexOfPage.
Это потому, что я также рекомендую вам использовать этот код только в этом методе
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{}
который вызывается, когда ваш scrollView заканчивает прокрутку и имеет номер вашей страницы действительно острый
Я рекомендую вам настроить scrollView на paged с помощью этого кода
[scrollView setPagingEnabled:YES];
Итак, это должно выглядеть так.
-(void) methodWhereYouSetYourScrollView
{
//set scrollView
[scrollView setPagingEnabled:YES];
scrollView.delegate = self;
}
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
int indexOfPage = scrollView.contentOffset.x / scrollView.frame.size.width;
//your stuff with index
}
Ответ 3
В swift я бы сделал это в расширении:
extension UIScrollView {
var currentPage:Int{
return Int((self.contentOffset.x+(0.5*self.frame.size.width))/self.frame.width)+1
}
}
Затем просто позвоните:
scrollView.currentPage
Ответ 4
Как указано выше, но как категория
@interface UIScrollView (CurrentPage)
-(int) currentPage;
@end
@implementation UIScrollView (CurrentPage)
-(int) currentPage{
CGFloat pageWidth = self.frame.size.width;
return floor((self.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
}
@end
Ответ 5
Просто разделите текущее смещение на размер страницы:
CGFloat pageNum = (int)(scrollView.contentOffset.x / scrollView.frame.size.width);
Ответ 6
Там уже есть хорошие ответы. Тем не менее, для сценариев, где контент не соответствует точно на странице, - и, как и я, вы хотите использовать результат для UIPageControl
, тогда важно использовать функцию ceil
.
Возьмем пример, где у меня есть "четыре и несколько" страниц содержимого.
Я опишу это на примере моей реальной жизни. Ширина содержимого составляет 3140 точек. Основываясь на размере кадра коллекции, ширина страницы составляет 728.
Таким образом, количество страниц равно:
3140 / 728 = 4.313
My numberOfPages
будет пять. Четыре из которых будут отображаться полностью, а последняя из которых - страница пять - покажет, что осталось 0.313
содержимого.
Теперь numberOfPages
означает, что индексы страницы будут 0, 1, 2, 3 и 4.
Когда я прокручиваю вправо, подбегая к окончательному смещению, метод scrollViewDidEndDecelerating
дает окончательное смещение X 2412.
Применение вычисления округления:
2412 / 728 = 3.313 then rounded = 3
Это неверно. Пользователь страницы просматривает с помощью offset должно быть:
Offset / Page User Is Viewing
0 0
728 1
1456 2
2184 3
2412 4
Правильный расчет с помощью ceil
:
private func pageForOffset(offset:CGFloat, pageWidth width:CGFloat) -> Int
{
let page = Int(ceil(offset / width))
NSLog("\(__FUNCTION__) offset \(offset) width \(width) page \(page) ")
return page
}
Ответ 7
Решение Aoakenfo удивительно, это еще одно решение, сочетающее ваш код с функцией scrollViewDidScroll и PageController
- (void)scrollViewDidScroll:(UIScrollView *)sender {
if (sender == self.scroll) {
int pageNum = (int)(self.scrPage.contentOffset.x / self.scrPage.frame.size.width);
self.pagecontroller.currentPage =pageNum;
}
}
Ответ 8
В xCode 7.x swift 2.x вы можете:
//MARK: - ScrollView Extensions
// Get the current page number
extension UIScrollView {
var currentPage: Int {
return Int(round(self.contentOffset.x / self.bounds.size.width))
}
// If you have reversed offset (start from contentSize.width to 0)
var reverseCurrentPage: Int {
return Int(round((contentSize.width - self.contentOffset.x) / self.bounds.size.width))-1
}
}
Ответ 9
Другой способ:
extension MyViewController: UIScrollViewDelegate {
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
let width = scrollView.frame.width
let page = Int(round(scrollView.contentOffset.x/width))
print("CurrentPage:\(page)")
}
}
Ответ 10
Я извлек это из нескольких наших приложений...
- (NSInteger)currentPage
{
if (0 == self.frame.size.width) {
NSLog(@"frame width == 0!");
return 0;
}
if (! self.currentPageValid) {
_currentPage = round(self.contentOffset.x / self.frame.size.width);
self.currentPageValid = YES;
}
return _currentPage;
}
Полный источник здесь
Ответ 11
Для быстрого я просто использовал бы это
let width = scrollView.frame.width
let page = round(scrollView.contentOffset.x/width)
Довольно просто, он в основном занимает положение scrollview x, делит его на ширину прокрутки, затем округляет его.
Ответ 12
Используете ли вы UIPageControl? Если это так, это свойство currentPage
. Если нет, я думаю, вам нужно будет вычислить индекс страницы из смещения scrollView.
Ответ 13
Если кто-нибудь ищет способ сделать в С# для Xamarin
public int CurrentIndex
{
get => (int)Math.Round(this.scrollView.ContentOffset.X / this.scrollView.Frame.Width);
set => this.scrollView.ScrollRectToVisible(new CGRect(new CGPoint(this.scrollView.Frame.Size.Width * value, 0), this.scrollView.Frame.Size), true);
}
Этот геттер и сеттер должны предоставить вам текущую страницу, а также позволить вам прокрутить до указанной страницы