大家。我是ios应用程序编程的超级初学者,使用TabBar创建视图时遇到了麻烦,这些视图将在滚动视图上向上/向下滚动隐藏。 (观点会像pinterest一样......)
我在网上彻底搜索过,找到了这样的图书馆; YIFullScreenScroll from GitHub
但是,在此示例中,TabBar和ToolBar似乎仅在视图顶部显示和消失,并且不在屏幕中间工作。
我真的很想知道即使在滚动视图的中间如何控制TabBar和ToolBar的隐藏。(像Pinterest ......)
提前为我凌乱的着作道歉...
但是,请帮帮我!!!
答案 0 :(得分:1)
我对Pinterest并不熟悉,所以我希望我能正确理解你要做的事情 我对Objective-c本人有点新意,所以也许有一种更简单的方法可以做到这一点,但这可以完成工作。
我不是母语为英语的人,所以如果我的解释不够清楚,请告诉我,我会尝试对其进行改写。
首先,符合UIScrollView委托并创建2个属性来保存标签栏和导航栏的原始框架
此外,将滚动视图的委托设置为视图控制器,可以从界面构建器或代码
ViewController.m
@interface ViewController () <UIScrollViewDelegate>
@property (nonatomic) CGRect navBarFrame;
@property (nonatomic) CGRect tabBarFrame;
@end
然后,在viewDidLoad中,设置上述属性
- (void)viewDidLoad {
[super viewDidLoad]
self.navBarFrame = self.navigationController.navigationBar.frame;
self.tabBarFrame = self.tabBarController.tabBar.frame;
}
现在我们将使用滚动视图的委托方法来确定滚动何时开始。
首先,我们从滚动开始时调用的委托开始,隐藏导航和标签栏
- (void)scrollViewDidBeginDragging:(UIScrollView *)scrollView
{
[UIView animateWithDuration: 0.3
delay: 0
options: UIViewAnimationOptionCurveLinear
animations: ^(void){
CGFloat tabBarX = self.tabBarController.tabBar.frame.origin.x;
CGFloat tabBarWidth = self.tabBarController.tabBar.frame.size.width;
CGFloat tabBarHeight = self.tabBarController.tabBar.frame.size.height;
self.tabBarController.tabBar.frame = CGRectMake(tabBarX, self.view.frame.size.height, tabBarWidth, tabBarHeight);
CGFloat navBarX = self.navigationController.navigationBar.frame.origin.x;
CGFloat navBarWidth = self.navigationController.navigationBar.frame.size.width;
CGFloat navBarHeight = self.navigationController.navigationBar.frame.size.height;
self.navigationController.navigationBar.frame = CGRectMake(navBarX, 0, navBarWidth, navBarHeight);
}
completion: ^(BOOL finished){
if(finished){
[self.tabBarController.tabBar setHidden: YES];
[self.navigationController.navigationBar setHidden: YES];
}
}];
}
现在我们将使用2个委托方法来确定滚动何时结束以再次显示标签栏和导航栏。
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
if(!decelerate){
[self.tabBarController.tabBar setHidden: NO];
[self.navigationController.navigationBar setHidden: NO];
[UIView animateWithDuration: 0.3
animations: ^(void){
self.tabBarController.tabBar.frame = self.tabBarFrame;
self.navigationController.navigationBar.frame = self.navBarFrame;
}];
}
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
[self.tabBarController.tabBar setHidden: NO];
[self.navigationController.navigationBar setHidden: NO];
[UIView animateWithDuration: 0.3
animations: ^(void){
self.tabBarController.tabBar.frame = self.tabBarFrame;
self.navigationController.navigationBar.frame = self.navBarFrame;
}];
}
我们调用两个单独方法的原因是,即使滚动视图仍在滚动(例如滚动速度非常快,然后停止滚动,滚动视图),每当用户停止滚动时,第一个被调用仍在滚动几秒钟,直到完全停止为止
第一种方法还有一个变量&#39;减速&#39;,它检查滚动是否仍在滚动。
由于我还不想在滚动视图仍在滚动时显示标签栏和导航栏,因此
第一种方法将运行代码,再次显示导航和标签栏,只有当'减速'时才会是假的,意味着滚动停止,
如果滚动视图在用户停止滚动后滚动,并且仅在滚动结束时滚动,则仅调用第二种方法。
然后我们将运行与上面相同的代码,再次显示选项卡和导航栏。
我们基本上只是创建一个动画,它将标签框和导航栏移出视图或视图。
我随机设置动画持续时间为0.3,
如果您希望显示和隐藏更快或更慢的条形,您可以将其更改为更多或更少。