Objective-C: ручная страница UIScrollView - PullRequest
1 голос
/ 20 апреля 2010

Я хочу использовать вид прокрутки как что-то вроде сборщика в горизонтальном режиме. Scrollview вмещает до семи подпредставлений. Каждое подпредставление представляет ценность. Всегда видны три вида, а посередине - выбранный.

Вид прокрутки, видимый в начале:

__ | V1 | V2

Scrollview установлен для просмотра / значения два:

V1 | V2 | V3

Scrollview установлен в последнее значение:

V2 | V3 | __

Реальная проблема, с которой я столкнулся, это флаг "pagingEnabled". Если для pagingEnabled задано значение YES, на страницах прокрутки всегда три подпредставления / значения вместо одного. Если для pagingEnabled задано значение NO, просмотр прокрутки не выполняется.

Есть ли хорошее решение для моей проблемы?

Большое спасибо, Дан;)

Ответы [ 3 ]

4 голосов
/ 27 апреля 2010

Измените рамку вида прокрутки так, как если бы он отображал только среднее представление (т.е. треть от его первоначальной ширины и смещено на ту же величину), но затем установите для свойства clipsToBounds значение NO.

1 голос
/ 01 декабря 2010

Я нашел решение, если кому-то еще интересно.

Назначение просмотра делегата для просмотра прокрутки. Ovveride scrollViewDidEndDecelerating, затем получить текущий индекс (страницу, которую вы хотите), выполнив что-то вроде.

 NSNumber* currentIndex = [NSNumber numberWithInt:round(scrollview.Contentoffset.x / PAGE_SIZE)];

//Then just update your scrollviews offset with


[scrollview setContentOffset:CGPointMake([currentIndex intValue] * PAGE_SIZE, 0) animated:YES];
0 голосов
/ 13 марта 2014

Начиная с iOS 5, в UIScrollViewDelegate есть метод делегата scrollViewWillEndDragging:withVelocity:targetContentOffset:. Это позволяет реализовать произвольный пейджинг.

Чтобы это работало, сначала нужно установить для свойства pagingEnabled значение NO, в противном случае метод делегата, о котором я говорю, не вызывается. Представление прокрутки теперь вызывает этот метод делегата всякий раз, когда пользователь поднимает палец, и представление прокрутки хочет определить, где завершить прокрутку.

Магия - последний аргумент, targetContentOffset: это указатель на CGPoint и используется как переменная ввода / вывода. Это означает, что эта переменная говорит вам, куда прокрутка хочет перейти. Но это позволяет вам изменить это целевое местоположение. velocity также может представлять интерес, он может дать вам указание, «нажал ли» пользователь на представление прокрутки или переместил его, остановил, а затем поднял палец.

Например, вот реализация, которая округляет целевое местоположение x до ближайшего кратного 100, делая таким образом «страницы» шириной 100 точек.

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
{
    targetContentOffset->x = round(targetContentOffset->x / 100.0) * 100.0;
}
...