Я хочу, чтобы UIScrollView быстро прокручивался после быстрой развертки, вроде этого. Хотя, когда пейджинг включен, свиток работает по одной странице за раз. Можно ли быстро прокручивать, когда пейджинг включен с щелчком пальца без ручной реализации с помощью распознавателей жестов?
Чувствительность/скорость прокрутки UIScrollView с подкачкой
Ответ 1
Это довольно просто, однако вы должны реализовать аспект пейджинга самостоятельно (что довольно просто). Вам не нужны распознаватели жестов.
Swift
Сначала настройте скорость замедления UIScrollView:
scrollView.decelerationRate = UIScrollViewDecelerationRateFast
Предположим, что у нас есть массив содержимого - пусть он назовет его yourPagesArray
. В UIScrollViewDelegate выполните следующий метод:
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>)
{
//This is the index of the "page" that we will be landing at
let nearestIndex = Int(CGFloat(targetContentOffset.pointee.x) / scrollView.bounds.size.width + 0.5)
//Just to make sure we don't scroll past your content
let clampedIndex = max( min( nearestIndex, yourPagesArray.count - 1 ), 0 )
//This is the actual x position in the scroll view
var xOffset = CGFloat(clampedIndex) * scrollView.bounds.size.width
//I've found that scroll views will "stick" unless this is done
xOffset = xOffset == 0.0 ? 1.0 : xOffset
//Tell the scroll view to land on our page
targetContentOffset.pointee.x = xOffset
}
Вам также понадобится реализовать следующий метод делегирования, чтобы обрабатывать случай, когда пользователь осторожно поднимает палец, не вызывая замедления прокрутки:
(Обновление: вам может и не понадобиться делать это в последнем пакете iOS SDK. Похоже, что вышеупомянутый метод делегата теперь вызывается, когда есть нулевая скорость.)
func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool)
{
if !decelerate
{
let currentIndex = floor(scrollView.contentOffset.x / scrollView.bounds.size.width)
let offset = CGPoint(x: scrollView.bounds.size.width * currentIndex, y: 0)
scrollView.setContentOffset(offset, animated: true)
}
}
Objective-C
Установка скорости торможения:
scrollView.decelerationRate = UIScrollViewDecelerationRateFast;
Затем выполните реализацию делегирования представления прокрутки:
- (void) scrollViewWillEndDragging:(UIScrollView *)scroll withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
{
//This is the index of the "page" that we will be landing at
NSUInteger nearestIndex = (NSUInteger)(targetContentOffset->x / scrollView.bounds.size.width + 0.5f);
//Just to make sure we don't scroll past your content
nearestIndex = MAX( MIN( nearestIndex, yourPagesArray.count - 1 ), 0 );
//This is the actual x position in the scroll view
CGFloat xOffset = nearestIndex * scrollView.bounds.size.width;
//I've found that scroll views will "stick" unless this is done
xOffset = xOffset==0?1:xOffset;
//Tell the scroll view to land on our page
*targetContentOffset = CGPointMake(xOffset, targetContentOffset->y);
}
- (void) scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
if( !decelerate )
{
NSUInteger currentIndex = (NSUInteger)(scrollView.contentOffset.x / scrollView.bounds.size.width);
[scrollView setContentOffset:CGPointMake(scrollView.bounds.size.width * currentIndex, 0) animated:YES];
}
}
Ответ 2
Я думаю, мы можем установить scrollView.userInteractionEnabled = NO, когда наш палец коснется его. И тогда, когда анимация остановится, откройте ее. Он работает для меня. Надеюсь, это поможет вам.
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
scrollView.userInteractionEnabled = NO;
}
// at the end of scroll animation, reset the boolean used when scrolls originate from the UIPageControl
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
scrollView.userInteractionEnabled = YES;
}