我不熟悉 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;
}];
}
我们调用 2 个单独的方法的原因是,当用户停止滚动时,第一个会被调用,即使滚动视图仍在滚动(比如当您滚动非常快,然后停止滚动时,滚动视图仍在滚动几秒钟,直到完全停止)
第一种方法还有一个变量“减速”,它检查滚动是否仍在滚动。
由于我不想在滚动视图仍在滚动时显示标签栏和导航栏,
第一种方法将运行代码再次显示导航栏和标签栏,仅当“减速”为假时,意味着滚动停止,
第二个方法只有在用户停止滚动后滚动视图确实滚动时才会被调用,并且只有在滚动结束时才会被调用。
然后我们将运行与上面相同的代码,再次显示选项卡和导航栏。
我们基本上所做的只是创建一个动画,它将选项卡和导航栏的框架移出视图或移入视图。
我随机设置动画时长为0.3,
如果您希望条形图更快或更慢地显示和隐藏,您可以将其更改为或多或少。
祝你好运。