Ответ 1
Выясняется, что простое решение было действительно возможным и легким:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (scrollView.contentOffset.y > 60) {
[scrollView setContentOffset:CGPointMake(0, 60)];
}
}
Я не смог найти ответ для этого (возможно, кто-то взломал решение вместе).
Можно ли отключить прокрутку в UIScrollView в одном направлении? Я не говорю об отключении вертикальной или горизонтальной прокрутки, но только в одном направлении. Так, например, в UIScrollView, я хочу иметь возможность перетаскивать прокрутку в направлении вниз, но не в направлении вверх
Спасибо
Выясняется, что простое решение было действительно возможным и легким:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (scrollView.contentOffset.y > 60) {
[scrollView setContentOffset:CGPointMake(0, 60)];
}
}
Это работает для меня:
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
scrollView.bounces = YES;
}
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
if (scrollView.contentOffset.y < 0) {
[scrollView setContentOffset:CGPointMake(0, 0)];
scrollView.bounces = NO;
}
if (scrollView.contentOffset.y == 0){
scrollView.bounces = YES;
}
else scrollView.bounces = YES;
}
К счастью, мы можем использовать scrollRectToVisible, чтобы избежать неустойчивого поведения после того, как прокрутка была ограничена:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (scrollView.contentOffset.y > 60) {
[scrollView setContentOffset:CGPointMake(0, 60)];
CGFloat pageWidth = scrollView.frame.size.width;
CGFloat pageHeight = scrollView.frame.size.height;
CGRect rect = CGRectMake(0, 0, pageWidth, pageHeight);
[scrollView scrollRectToVisible:rect animated:YES];
}
}
Вышеупомянутые решения будут reset равными нулю, ноль, если пользователь случайно прокручивает по вертикали. Попробуйте это...
- (void)scrollViewDidScroll:(UIScrollView *) scrollView {
if (scrollView.contentOffset.y > 0) {
[scrollView setContentOffset:CGPointMake(scrollView.contentOffset.x, 0)];
}
}
Если вы устанавливаете, что contentSize скроллера равно размеру содержимого, в одном из направлений прокрутка исчезнет в этом направлении, потому что прокручиваться не будет.
Альтернативой может быть:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (scrollView.contentOffset.y < 10) {
scrollView.bounces = NO;
}
else scrollView.bounces = YES;
}
Но помните, что это будет работать только для scrollViews, у которых больше контента, чем у их кадров.
Вместо того, чтобы использовать UIScrollViewDelegate для исправления уже неверного contentOffset (что приведет к неустойчивому поведению), вы можете захотеть рассмотреть подкласс UIScrollView вместо этого и переопределить setContentOffset:
- (void)setContentOffset:(CGPoint)contentOffset {
if (contentOffset.y <= 60) {
[super setContentOffset:contentOffset];
}
}
Конечно, это можно обобщить, добавив свойство для минимального или максимального допустимого значения для смещения содержимого. Возможно, вам придется переопределить setContentOffset: анимированный:.
это работает для меня
static CGPoint lastOffset;
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
scrollView.scrollEnabled = YES;
}
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
scrollView.scrollEnabled = YES;
lastOffset = scrollView.contentOffset;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
CGPoint nowOffset = scrollView.contentOffset;
NSLog(@"delta %f", lastOffset.x - nowOffset.x);
if ((lastOffset.x - nowOffset.x) < 0) {
//uncomment to prevent scroll to left
//scrollView.scrollEnabled = NO;
} else if ((lastOffset.x - nowOffset.x) > 0) {
//uncomment to prevent scroll to right
//scrollView.scrollEnabled = NO;
} else {
scrollView.scrollEnabled = YES;
}
}
Можно удалить прокрутку в вертикальном направлении, установив высоту scrollView.contentSize на то же значение, что и scrollView.frame.size.height. Любой переполненный контент будет скрыт. То же самое можно сделать и для ограничения вертикальной прокрутки.