bryankeller / BLKFlexibleHeightBar

Create condensing header bars like those seen in the Facebook, Square Cash, and Safari iOS apps.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

weird _adjustContentOffsetIfNecessary changed my contentOffset

liuxuan30 opened this issue · comments

commented

I have two tabs, each contains one UICollectionView. I embed SVPullToRefresh in each UICollectionView as well. I set up the snapping by 0.5 threshold for BLK height bar.

tab 1 has 6 cells and tab 2 has 20 cells, so tab 2 could snap to progress 1, while tab 1 cannot.
My behaviour is copied from Facebook style behaviour:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if(!self.isCurrentlySnapping)
    {
        CGFloat deltaYOffset = scrollView.contentOffset.y - self.previousYOffset;
        CGFloat deltaProgress = deltaYOffset / (self.flexibleHeightBar.maximumBarHeight-self.flexibleHeightBar.minimumBarHeight);

        self.flexibleHeightBar.progress = self.previousProgress + deltaProgress;
        NSLog(@"contentOffset Y %f, previousYOffset:%f, progress %f",scrollView.contentOffset.y,self.previousYOffset, self.previousProgress + deltaProgress);

        [self.flexibleHeightBar setNeedsLayout];
    }
}

everytime when switching tab, I will update the UICollectionView like this:

targetCollection.delegate = (id<UICollectionViewDelegate>)self.delegateSplitter;
targetCollection.contentOffset = CGPointMake(targetCollection.contentOffset.x, -CGRectGetHeight(self.BLKBar.frame));

the second line is to keep the BLKBar height consistent while switching between tabs. e.g. When the BLK height bar is at minimum height, I should keep it, so I need to update the offset when switching to target tab.

Steps:
First, I switch from tab 1 to tab 2; BLKBar is at progress 0;
when I am on tab 2, I scroll the UICollectionView, snap BLKBar to progress 1;
Then I switch to tab 1 by paning horizontally, ideally the BLK Bar should keep the snapping at progress 1, aka minimum height, however, I found it is at progress 0!

In order to debug, I subclass a HackUICollectionView to see what is happenning.

I setup my BLKBar minimum height is 64, max height is 108.

so while debugging, after
targetCollection.contentOffset = CGPointMake(targetCollection.contentOffset.x, -CGRectGetHeight(self.BLKBar.frame));
is set to (0,-64),

there is one API called _adjustContentOffsetIfNecessary changed my contentOffset to -108:

...
    frame #8: 0x000000010a008bda UIKit`-[UIScrollView setContentOffset:] + 645
    frame #9: 0x000000010969e3ca MCompass`-[HackUICollectionView setContentOffset:](self=0x00007f8279854e00, _cmd=0x000000010a765895, contentOffset=(x = 0, y = -108)) + 74 at HackUICollectionView.m:14
    frame #10: 0x0000000109b5bbf6 Foundation`_NSSetPointValueAndNotify + 139
    frame #11: 0x000000010a01d535 UIKit`-[UIScrollView(UIScrollViewInternal) _adjustContentOffsetIfNecessary] + 1445
    frame #12: 0x000000010a01a727 UIKit`-[UIScrollView(UIScrollViewInternal) _stopScrollingNotify:pin:tramplingDragFlags:] + 417
...

If I override _adjustContentOffsetIfNecessary in sub class, it will not change it to -108 obviously, but I CANNOT fix my problem by this way because it is a internal API, I cannot simply pass through it.

Any idea why this happened? How can I keep the progress while switching UICollectionViews?

Thanks for the detailed explanation. I'll look into this soon.