我已经实现了一个UITableViewController。
第一部分是一张大图。当视图控制器最初出现时,我将navigationBar设置为半透明。
当向下滚动tableview时,navigationBar.translucent设置为NO,并且tableview内容框架向上移动,以便第一部分不在屏幕上。我在scrollview委托中实现了这个动作:
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
当桌面视图向上滚动时,导航再次变为半透明,并恢复了桌面视图框架。
问题是,当scrollview委托捕获滚动手势时。一旦tableview和navigationBar开始动画。 tableview的滚动动作停止。因此,如果我想将tableview滚动到底部,我必须滚动两次,第一次动画帧然后再滚动,我认为它可以增强。
这是代码。
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if (scrollView == _subTable) {
NSIndexPath * indexPath ;
CGFloat offset = scrollView.contentOffset.y;
if ((offset - currentOffset)>40) {
if (!scrollAnimate) {
self.navigationController.navigationBar.translucent = NO;
[UIView animateWithDuration:0.5 animations:^{
[_mainTable setContentOffset:CGPointMake(0, headHeight) animated:YES];
[_subTable setFrame:CGRectMake(CGRectGetWidth(self.menuTable.frame) , 0, kScreen_Width/3.5*2.5, kScreen_Height-schedualHeight-48)];
[_mainTable setFrame:CGRectMake(0, 0, kScreen_Width, _mainTable.frame.size.height+headHeight)];
[_menuTable setFrame: CGRectMake(0, 0, kScreen_Width/3.5, _mainTable.frame.size.height+headHeight-48)];
}];
if (CGRectGetMaxY(_checkOutBar.frame)!= kScreen_Height-44)
{
[_checkOutBar setFrame:CGRectOffset(_checkOutBar.frame, 0, -44)];
}
scrollAnimate = !scrollAnimate;
frameOffset = !frameOffset;
[_mainTable reloadData];
_checkOutBar.tag = 1000;
}
}
else if((offset - currentOffset)<-40)
{
if (scrollAnimate) {
self.navigationController.navigationBar.translucent = YES;
[UIView animateWithDuration:0.5 animations:^{
[_mainTable setFrame:CGRectMake(0, 0, kScreen_Width, kScreen_Height+self.navigationController.navigationBar.frame.size.height+headHeight)];
[self.mainTable setFrame:CGRectOffset(_mainTable.frame, 0, -(self.navigationController.navigationBar.frame.size.height))];
[_subTable setFrame:CGRectMake(CGRectGetWidth(self.menuTable.frame), 0, kScreen_Width/3.5*2.5, tableHeight)];
[_menuTable setFrame:CGRectMake(0, 0, kScreen_Width/3.5, tableHeight)];
}];
scrollAnimate = !scrollAnimate;
frameOffset = !frameOffset;
[_mainTable reloadData];
if (CGRectGetMaxY(_checkOutBar.frame)!= kScreen_Height) {
[_checkOutBar setFrame:CGRectOffset(_checkOutBar.frame, 0, 44)];
}
_checkOutBar.tag = 2000;
}
}
if ((offset - currentOffset)>0)
{
indexPath = [[_subTable indexPathsForVisibleRows]lastObject];
}
else
{
indexPath = [[_subTable indexPathsForVisibleRows]firstObject];
}
if (indexPath) {
if (indexPath.row == 0) {
selected = indexPath.section;
[_menuTable reloadData];
}
}
currentOffset = offset;
}
}
答案 0 :(得分:0)
来自Apple文档。设置NavigationController。 hidesBarsOnSwipe = YES; hidesBarsOnSwipe 属性 一个布尔值,指示导航栏是否隐藏其条形以响应滑动手势。
声明:
SWIFT:
var hidesBarsOnSwipe: Bool
目标-C:
@property(nonatomic, readwrite, assign) BOOL hidesBarsOnSwipe
讨论:
当此属性设置为YES
时,向上滑动会隐藏导航栏和工具栏。向下滑动再次显示两个条形。如果工具栏没有任何项目,即使在滑动后它仍然可见。此属性的默认值为NO
。
状况: 适用于iOS 8.0及更高版本。