基於@布賴恩建議我做了這個代碼:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
CGFloat height = navigationBar.frame.size.height;
CGFloat y = scrollView.bounds.origin.y;
if (y <= 0) {
CGRect frame = navigationBar.frame;
frame.origin.y = 0;
navigationBar.frame = frame;
} else if (tableView.contentSize.height > tableView.frame.size.height) {
CGFloat diff = height - y;
CGRect frame = navigationBar.frame;
frame.origin.y = -y;
navigationBar.frame = frame;
CGFloat origin = 0;
CGFloat h = height; // height of the tableHeaderView
if (diff > 0) {
origin = diff;
h = y;
}
frame = tableView.frame;
frame.origin.y = origin;
frame.size.height = tableView.superview.frame.size.height - origin;
tableView.frame = frame;
CGRect f = CGRectMake(0, 0, tableView.frame.size.width, h);
UILabel* label = [[UILabel alloc] initWithFrame:f];
tableView.tableHeaderView = label;
[label release];
}
}
我的代碼有一個UITableView但應與任何滾動組件工作。如果除了navigationBar和UIScrollView子類之外還有其他組件,則應該更改可滾動組件高度的計算方式。這樣的事情:
frame.size.height = tableView.superview.frame.size.height - origin - otherComponentsHeight;
我需要添加一個愚蠢tableHeaderView具有所需的行爲。問題是,當scrollViewDidScroll:被調用時,內容有偏移量,但移動Safari中的可見性是內容不會滾動,直到導航條完全消失。我首先嚐試將contentOffset.y更改爲0,但顯然它不起作用,因爲所有代碼都依賴於滾動機制。所以我只是添加了一個tableHeaderView,它的高度恰好是滾動的偏移量,所以頭部永遠不會被看到,並且內容似乎不會滾動,直到導航條完全消失。
如果您不添加啞表tableHeaderView,則可滾動組件會顯示在導航欄後面滾動。
隨着tableHeaderView,所述滾動組件實際上是滾動(如圖滾動條),但由於存在tableHeaderView其高度恰好比滾動偏離相同的,可滾動內容似乎不可以滾動,直到完全的導航欄消失:
類似的問題:HTTP://計算器。com/questions/21929220/show-hide-uitoolbar-match-finger-movement-exactly-as-in-for-example-ios7-s這是非常微妙的做它它像safari .... – Fattie 2014-02-28 20:39:09