我在嵌入UINavigationController
中顯示UITableViewController
。我還創建了一個動畫,當用戶向上滾動時,將導航欄從屏幕上滑出,與用戶的手指動作相匹配(我提到了這一點,因爲刪除此動畫也會消除我的錯誤,但我不知道爲什麼)。當用戶選擇表格的一行時,會出現一個新的(空白)UIViewController
,其中隱藏了狀態欄。當第二個控制器被抽頭解散時,我們返回到第一個控制器。Swift中的奇數導航欄/狀態欄行爲
在第二個控制器被解僱後,根據第一個控制器的tableview是否一直滾動到表頂部或者當表格行被第一次選擇時,可能會出現一些非常奇怪的行爲。
方案1:如果選擇了行當表被滾動到的最頂部,導航欄出現的第二個視圖控制器被駁回後本身夾到其邊界。換句話說,狀態欄不再具有與導航欄相同的背景顏色,但是是透明的:表格視圖的行現在在狀態欄下可見。
方案2:如果表不是滾動以當被選擇的行的最頂部,導航欄/狀態欄的行爲是完全正常的所述第二控制器被駁回後,任何揮之不去的古怪的行爲是糾正。
這裏是我的(濃縮)代碼:
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您表視圖Y軸startig所以這就是爲什麼這個問題會發生 –
@AshishKakkad @Moseph你是說我應該改變'變種previousScrollViewYOffset :CGFloat = 0'到'var previousScrollViewYOffset:CGFloat = 64'?我試過了,行爲和以前完全一樣。 –