3

我試圖做出同樣的影響,因爲instagram已經在它們的標題中。我怎樣才能做到這一點?像Instagram的導航欄(iOS 7)

我嘗試了很多解決方案。

最佳 - https://github.com/andreamazz/AMScrollingNavbar

但它有一個很大的問題 - 它的使用uipangesturerecognizer移動棒。這對我很不好,因爲我想表現出來吧,如果桌子在頂端。

我試圖將此控件的工作更改爲滾動視圖委託,但發現它有很多問題,你有什麼想法,他們是如何做到這一點的?

instagram main screen

回答

2

使用AMScrollingNavbar你tableViewController並覆蓋willDisplayCell方法來顯示欄,如果表滾動到頂部:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (indexPath.row == 0) { 
     [self showNavbar]; 
    } 
} 
1

使用該庫,添加到您的視圖控制器:

- (BOOL)scrollViewShouldScrollToTop { 
    [self showNavbar]; 
    return YES; 
} 
+0

或scrollViewDidScrollToTop,然後你沒有返回任何東西。 – Craig

3

我發現解決方案,就像你說的 - 你必須解決滾動視圖委託點亮雖然有點兒,但在2個小時後我已經明白了。我試圖解決的問題就是能夠像在Instagram中一樣,以一個連續的動作獲取標題。

因此,首先檢查出XIB設置,它具有一個頭視圖(0 20,320 85),這是正確的後面在一個表視圖(0 20,320 548)

xib setup

因此,這裏是什麼樣子發射後(在黃表視圖幀): after launch

這是我希望它看起來像拉低(紅頭幀)後: after pulling down

所以我只是將代碼粘貼到評論中,我希望它足夠容易理解。

做一個定義

#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相同。

+0

scrollView.delegate = nil; [scrollView setContentOffset:currentScrollViewOffset]; scrollView.delegate = self;這節省了我的時間謝謝你 – aryaxt

+1

這應該被選爲答案 – aryaxt

+0

這不適用於UIScrollView的反彈。 – mayqiyue

3

你可以在你想要在導航欄上添加效果的課程中使用下面提到的方法。

- (void)scrollViewDidScroll:(UIScrollView *)sender { 
//Initializing the views and the new frame sizes. 
UINavigationBar *navbar =self.navigationController.navigationBar; 
UIView *tableView = self.view; 
CGRect navBarFrame = self.navigationController.navigationBar.frame; 

CGRect tableFrame = self.view.frame; 

//changing the origin.y based on the current scroll view. 
//Adding +20 for the Status Bar since the offset is tied into that. 

if (isiOS7) { 
    navBarFrame.origin.y = MIN(0, MAX(-44, (sender.contentOffset.y * -1))) +20 ; 
    tableFrame.origin.y = navBarFrame.origin.y + navBarFrame.size.height; 
}else{ 
    navBarFrame.origin.y = MIN(0, (sender.contentOffset.y * -1)) +20; 
    tableFrame.origin.y = MIN(0,MAX(-44,(sender.contentOffset.y * -1))) ; 
} 

navbar.frame = navBarFrame; 
tableView.frame = tableFrame; 

}

+0

這工作正常,但只有滾動到頂部時,導航欄纔會重新出現。如果你決定在任何點上滾動,你怎麼能再次顯示導航欄? – Halpo