显示/隐藏导航栏时计算新的滚动视图内容插入

时间:2017-11-20 23:57:01

标签: ios objective-c uiscrollview

我正在复制Facebook / Apple News隐藏/显示导航栏功能。我可以隐藏/显示导航栏,但我不知道如何在导航栏frame.origin.y发生变化时计算滚动视图的内容插入。我希望滚动视图内容插入跟随导航栏的位置,以便它看起来都很流畅。

这就是我正在做的事情:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
CGFloat navBarTopLength = self.navigationController.topLayoutGuide.length; // 20
CGRect frame = self.navigationController.navigationBar.frame;
CGFloat size = frame.size.height - (navBarTopLength + 1);
CGFloat framePercentageHidden = ((navBarTopLength - frame.origin.y) / (frame.size.height - 1));
CGFloat scrollOffset = scrollView.contentOffset.y;
CGFloat scrollDiff = scrollOffset - self.previousScrollViewYOffset;
CGFloat scrollHeight = scrollView.frame.size.height;
CGFloat scrollContentSizeHeight = scrollView.contentSize.height + scrollView.contentInset.bottom;

if (scrollOffset <= -scrollView.contentInset.top) {
    frame.origin.y = navBarTopLength; // showing nav bar
} else if ((scrollOffset + scrollHeight) >= scrollContentSizeHeight) {
    frame.origin.y = -size;
} else {
    frame.origin.y = MIN(navBarTopLength, MAX(-size, frame.origin.y - scrollDiff));
}

CGFloat top;

if (self.previousScrollViewYOffset > scrollOffset) {
    NSLog(@"scrolling down"); //scrolling down
    top = self.navigationController.navigationBar.frame.size.height + frame.origin.y;
} else {
    NSLog(@"scrolling up"); //scrolling up
    top = (navBarTopLength + 1) + frame.origin.y;
}

[self.navigationController.navigationBar setFrame:frame];
[self updateBarButtonItems:(1 - framePercentageHidden)];
scrollView.contentInset = UIEdgeInsetsMake(top, 0, 0, 0);
self.previousScrollViewYOffset = scrollOffset;
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
  [self stoppedScrolling];
}

- (void)updateBarButtonItems:(CGFloat)alpha {
  [self.navigationItem.leftBarButtonItems enumerateObjectsUsingBlock:^(UIBarButtonItem *item, NSUInteger i, BOOL *stop) {
    item.customView.alpha = alpha;
}];
  [self.navigationItem.rightBarButtonItems enumerateObjectsUsingBlock:^(UIBarButtonItem *item, NSUInteger i, BOOL *stop) {
    item.customView.alpha = alpha;
}];
  self.navigationItem.titleView.alpha = alpha;
  self.navigationController.navigationBar.tintColor =[self.navigationController.navigationBar.tintColor colorWithAlphaComponent:alpha];
 }

- (void)animateNavBarTo:(CGFloat)y {
[UIView animateWithDuration:0.2
                 animations:^{
                     CGRect frame = self.navigationController.navigationBar.frame;
                     BOOL hide = frame.origin.y >= y;
                     CGFloat alpha = (hide ? 0 : 1);
                     frame.origin.y = y;
                     [self.navigationController.navigationBar setFrame:frame];
                     [self updateBarButtonItems:alpha];
                     self.navBarHidden = hide;
                 }];
}

- (void)stoppedScrolling {
  CGRect frame = self.navigationController.navigationBar.frame;
  if (frame.origin.y < 20) {
    [self animateNavBarTo:-(frame.size.height - 21)];
  }
}

我知道我应该更改scrollViewDidScroll中的内容插入,因为我正在计算导航栏的新框架。我正在计算新的顶部插图的方式会使整个用户界面发生震动,所有内容在BAD ACCESS

后不久就会中断

0 个答案:

没有答案