2015-11-23 96 views
0

我在嵌入UINavigationController中顯示UITableViewController。我還創建了一個動畫,當用戶向上滾動時,將導航欄從屏幕上滑出,與用戶的手指動作相匹配(我提到了這一點,因爲刪除此動畫也會消除我的錯誤,但我不知道爲什麼)。當用戶選擇表格的一行時,會出現一個新的(空白)UIViewController,其中隱藏了狀態欄。當第二個控制器被抽頭解散時,我們返回到第一個控制器。Swift中的奇數導航欄/狀態欄行爲

在第二個控制器被解僱後,根據第一個控制器的tableview是否一直滾動到表頂部或者當表格行被第一次選擇時,可能會出現一些非常奇怪的行爲。

方案1:如果選擇了行當表被滾動到的最頂部,導航欄出現的第二個視圖控制器被駁回後本身夾到其邊界。換句話說,狀態欄不再具有與導航欄相同的背景顏色,但是是透明的:表格視圖的行現在在狀態欄下可見。

方案2:如果表不是滾動以當被選擇的行的最頂部,導航欄/狀態欄的行爲是完全正常的所述第二控制器被駁回後,任何揮之不去的古怪的行爲是糾正。

scenarios

這裏是我的(濃縮)代碼:

import UIKit 

class ViewControllerTest: UITableViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     navigationController!.navigationBar.barTintColor = UIColor.grayColor() 
     navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Add, target: nil, action: nil) 
    } 

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
     presentViewController(OtherViewControllerWithNoStatusBar(), animated: false, completion: nil) 
    } 

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return 100 
    } 

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = UITableViewCell() 
     cell.textLabel!.text = "item \(indexPath.row)" 
     return cell 
    } 

    var previousScrollViewYOffset : CGFloat = 0 

    override func scrollViewDidScroll(scrollView: UIScrollView) { 
     //for navBar hiding 
     let navBar = navigationController!.navigationBar 
     var f = navBar.frame; 
     let size = f.size.height - 21; 
     let framePercentageHidden = ((20 - f.origin.y)/(f.size.height - 1)); 
     let scrollOffset = scrollView.contentOffset.y; 
     let scrollDiff = scrollOffset - self.previousScrollViewYOffset; 
     let scrollHeight = scrollView.frame.size.height; 
     let scrollContentSizeHeight = scrollView.contentSize.height + scrollView.contentInset.bottom; 

     if scrollOffset <= -scrollView.contentInset.top { 
      f.origin.y = 20 
     } else if (scrollOffset + scrollHeight) >= scrollContentSizeHeight { 
      f.origin.y = -size 
     } else { 
      f.origin.y = min(20, max(-size, f.origin.y - scrollDiff)) 
     } 

     navBar.frame = f 
     navBar.tintColor = navBar.tintColor.colorWithAlphaComponent(1 - framePercentageHidden) 
     self.previousScrollViewYOffset = scrollOffset 
    } 
} 

class OtherViewControllerWithNoStatusBar : UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     view.backgroundColor = UIColor.greenColor() 
     let label = UILabel(frame: view.bounds) 
     label.text = "Tap to dismiss!" 
     view.addSubview(label) 
     view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "dismiss")) 
    } 

    override func prefersStatusBarHidden() -> Bool { 
     return true 
    } 

    func dismiss() { 
     presentingViewController!.dismissViewControllerAnimated(false, completion: nil) 
    } 

} 

我想知道的是:(1)爲什麼在方案1中發生的行爲,(2)我該怎麼辦修理它?

我使用的是Xcode 7.1,我已經在iPhone 5 & 6和iOS 9.1上測試了這個。

+0

從0您表視圖Y軸startig所以這就是爲什麼這個問題會發生 –

+0

@AshishKakkad @Moseph你是說我應該改變'變種previousScrollViewYOffset :CGFloat = 0'到'var previousScrollViewYOffset:CGFloat = 64'?我試過了,行爲和以前完全一樣。 –

回答

2

這是我的小建議,爲什麼你沒有嘗試過的簡單/本地答案使用use default navigation bar並設置動畫想顯示/隱藏

上刷卡事件

navigationController?.hidesBarsOnSwipe = true 

on Select/Tap Event

// setting hidesBarsOnTap to true 
    navigationController?.hidesBarsOnTap = true 

附加Information

否則使用簡單/本地功能的顯示和隱藏動畫像

self.navigationController?.setNavigationBarHidden(true, animated: true) 
UIApplication.sharedApplication().statusBarHidden=true 
+0

感謝您提及這些原生選項;我沒有意識到他們。我一定會嘗試一下。但是,您是否知道我發佈的現有代碼有什麼問題? –

+0

@實際上你的編碼是好​​的,但是在didscroll方法中調用,它在multipel時間內調用每次刷卡,否則將你的代碼改爲willbeginDragging,它只在scroll上調用一次 –