我發現解決方案,就像你說的 - 你必須解決滾動視圖委託點亮雖然有點兒,但在2個小時後我已經明白了。我試圖解決的問題就是能夠像在Instagram中一樣,以一個連續的動作獲取標題。
因此,首先檢查出XIB設置,它具有一個頭視圖(0 20,320 85),這是正確的後面在一個表視圖(0 20,320 548)
因此,這裏是什麼樣子發射後(在黃表視圖幀):
這是我希望它看起來像拉低(紅頭幀)後:
所以我只是將代碼粘貼到評論中,我希望它足夠容易理解。
做一個定義
#define SIGNIFICANT_SCROLLING_DISTANCE 200
創建兩個屬性
@property (nonatomic) CGFloat lastScrollViewOffsetY;
@property (nonatomic) CGFloat distancePulledDownwards;
不是添加以下實施scrollViewDidScroll
委託方法
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
// store current scroll view frame as we will change it later on and set it
// back to the scroll view in the very end
CGRect currentScrollViewRect = scrollView.frame;
// same with the content offset
CGPoint currentScrollViewOffset = scrollView.contentOffset;
CGFloat offsetShiftY = self.lastScrollViewOffsetY - scrollView.contentOffset.y;
if (offsetShiftY > 0) {
// pulling downwards
// keep trrack of the distance that we pulled downwards
self.distancePulledDownwards += offsetShiftY;
// header opens (table view shifts its frame down) in two cases:
// 1. contentOffset.y<0
// 2. scrolled downwards a significant amount or header is already open
// but in both cases we have to make sure that it doesn't open further than we want it to
CGFloat wantedOriginY = currentScrollViewRect.origin.y;
if ((scrollView.contentOffset.y<0) || (self.distancePulledDownwards > SIGNIFICANT_SCROLLING_DISTANCE) || (currentScrollViewRect.origin.y>20)){
// shift scroll views frame by offset shift
wantedOriginY = currentScrollViewRect.origin.y + offsetShiftY;
// compensate that shift by moving content offset back
currentScrollViewOffset.y += (wantedOriginY <= 105) ? offsetShiftY : 0;
}
currentScrollViewRect.origin.y = (wantedOriginY <= 105) ? wantedOriginY : 105;
}
else {
// pulling upwards
self.distancePulledDownwards = 0;
// header closes (table view shifts its frame up) in one case: when it is open =) (and contentOffset.y>0 to eliminate closing on bounce)
if (scrollView.contentOffset.y > 0) {
CGFloat wantedOriginY = currentScrollViewRect.origin.y + offsetShiftY;
currentScrollViewRect.origin.y = (wantedOriginY >= 20) ? wantedOriginY : 20;
currentScrollViewOffset.y += (wantedOriginY >= 20) ? offsetShiftY : 0;
}
}
// set the changed (if it was changed at all) frame to the scroll view
[scrollView setFrame:currentScrollViewRect];
// correct offset using a special trick
// it ensures that scrollViewDidScroll: won't be called on setting the offset
scrollView.delegate = nil;
[scrollView setContentOffset:currentScrollViewOffset];
scrollView.delegate = self;
// and finally remember the current offset as the last
self.lastScrollViewOffsetY = scrollView.contentOffset.y;
}
,享受你光滑的表來回滾動上屏幕=) 這也可以修改,你可以添加和調整標題的大小,使它基本與Instagram相同。
或scrollViewDidScrollToTop,然後你沒有返回任何東西。 – Craig