Я попытался реализовать такое табличное представление, которое обнаруживает количество прокрутки и решает показать панель навигации или нет.iOS скрывает панель навигации из-за количества прокрутки
@interface HomeViewController() {
NSInteger scrollAmount;
bool navbarHidden = NO;
}
@implementation HomeViewController
@synthesize lastContentOffset = _lastContentOffset;
bool navbarHidden = NO;
- (void)awakeFromNib
{
[super awakeFromNib];
scrollAmount = 0;
distance = 50;
}
-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
CGPoint offset = scrollView.contentOffset;
CGRect bounds = scrollView.bounds;
UIEdgeInsets inset = scrollView.contentInset;
if (offset.y > self.lastContentOffset.y)
{
scrollAmount++;
}
else
{
scrollAmount--;
}
bool awayFromTop = offset.y > distance + inset.top;
if (awayFromTop && !navbarHidden) {
[[self navigationController] setNavigationBarHidden:YES animated:YES];
navbarHidden = YES;
} else if (!awayFromTop || (scrollAmount < -100)) {
[[self navigationController] setNavigationBarHidden:NO animated:YES];
navbarHidden = NO;
}
self.lastContentOffset = offset;
}
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
scrollAmount = 0;
}
В основном, scrollViewDidScroll
подсчитывает количество прокрутки, а если пользователь прокручивает вверх, то декремент scrollAmount
на минус 1.
offset
И если достаточно близко к верхней части экрана (!awayFromTop
) ИЛИ количество прокрутки меньше -100, ожидается, что панель навигации будет скрыта.
Когда я положил NSLog
для scrollAmount
программа работает правильно, она скрывает nav. бар, когда пользователь находится сверху или показывает, когда приближаются к вершине и scrollAmount
.
Но когда scrollAmount
достигает значения -100 [[self navigationController] setNavigationBarHidden:NO animated:YES];
не выполнен и как-то scrollViewDidScroll
называется бесконечно, я имею в виду, что программа вводит бесконечный цикл. scrollAmount
печатается как -100, -101, -102, ..., - 1005 ...
Тогда я использовал ниже код:
if ([scrollView.panGestureRecognizer translationInView:self.view].y < heightOfScreen/-4.0f && !navbarHidden) {
[self.navigationController setNavigationBarHidden:YES animated:YES];
navbarHidden = YES;
} else if ([scrollView.panGestureRecognizer translationInView:self.view].y > heightOfScreen/4.0f && navbarHidden) {
[self.navigationController setNavigationBarHidden:NO animated:YES];
navbarHidden = NO;
}
Очевидно [scrollView.panGestureRecognizer translationInView:self.view].y
дает н. аналогично scrollAmount
, но он отлично работает, теперь мне интересно, почему моя реализация не удалась. Любые идеи оценили.
На самом деле я включил альтернативное и рабочее решение в вопрос ('scrollView.panGestureRecognizer'). Однако мне нужно выяснить это странное поведение. Ответ, который примет знак, будет тем, который дает правильное устранение неполадок, но спасибо за ваше предложение, может быть, некоторые могут его использовать. –