UIScrollView 与 UINavigationBar 的动态大小
Posted
技术标签:
【中文标题】UIScrollView 与 UINavigationBar 的动态大小【英文标题】:Dynamic size of UIScrollView with UINavigationBar 【发布时间】:2013-06-10 11:54:02 【问题描述】:我想知道是否有简单或简洁的方法来实现 UIScrollView
根据页码的不同大小和框架来源?我想在第一页显示导航栏,但在其他页面上隐藏它。
我想到的第一个想法是使用scrollViewDidScroll:(UIScrollView *)scrollView
方法,我可以通过setFrame:(CGRect)
设置框架原点和大小。
这是一团糟,因为我在其他地方定义了这个scrollView
,并带有初始ContentSize
和页数等。所以实际上,在加载整个视图后,我必须在用户滚动视图时处理帧变化。
我现在拥有的:
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
CGFloat pageWidth = self.scrollView.frame.size.width;
int page = floor((self.scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
self.pageController.currentPage = page;
[self.navigationController.navigationBar setHidden:page];
if (page)
[self.view setFrame:CGRectMake(0, -44, self.view.frame.size.width, self.view.frame.size.height + 44)];
[self.view setBackgroundColor:[UIColor redColor]];
[self.scrollView setFrame:CGRectMake(0, 0, self.scrollView.frame.size.width, self.scrollView.frame.size.height)];
[self.scrollView setBackgroundColor:[UIColor greenColor]];
else
[self.view setFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
[self.view setBackgroundColor:[UIColor redColor]];
[self.scrollView setFrame:CGRectMake(0, 0, self.scrollView.frame.size.width, self.scrollView.frame.size.height)];
[self.scrollView setBackgroundColor:[UIColor greenColor]];
颜色仅用于可视化调试。把它想象成跳板,不时出现导航栏。所以scrollView
是视图的一部分,而不是整个视图。不确定想法是否值得,但我不是那个发号施令的人,所以我正在努力寻找任何东西。是这样吗?
【问题讨论】:
【参考方案1】:我终于想出了这个(同样的代码放在-(void)scrollViewDidScroll:
中)
-(void)viewWillAppear:(BOOL)animated
NSLog(@"HomeVC: viewWillAppear");
CGFloat pageWidth = self.scrollView.frame.size.width;
int page = floor((self.scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
self.pageController.currentPage = page;
if (page > 0)
[self.navigationController setNavigationBarHidden:YES animated:NO];
[self.view setFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height + 44)];
[self.view setBackgroundColor:[UIColor clearColor]];
[self.scrollView setFrame:CGRectMake(0, 0, HOMESCREEN_WIDTH, HOMESCREEN_HEIGHT + 44)];
[self.scrollView setContentSize:CGSizeMake(HOMESCREEN_WIDTH * SCREEN, HOMESCREEN_HEIGHT + 44)];
[self.scrollView setBackgroundColor:[UIColor clearColor]];
[self.pageController setCenter:CGPointMake(HOMESCREEN_WIDTH/2, self.scrollView.frame.size.height + 5)];
else
[self.navigationController setNavigationBarHidden:NO animated:NO];
[self.view setFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
[self.view setBackgroundColor:[UIColor redColor]];
[self.scrollView setFrame:CGRectMake(0, 0, HOMESCREEN_WIDTH, HOMESCREEN_HEIGHT)];
[self.scrollView setContentSize:CGSizeMake(HOMESCREEN_WIDTH * SCREEN, HOMESCREEN_HEIGHT)];
[self.scrollView setBackgroundColor:[UIColor clearColor]];
[self.pageController setCenter:CGPointMake(HOMESCREEN_WIDTH/2, self.scrollView.frame.size.height + 5)];
[self.navigationController setToolbarHidden:YES animated:YES];
它正在工作!
【讨论】:
以上是关于UIScrollView 与 UINavigationBar 的动态大小的主要内容,如果未能解决你的问题,请参考以下文章
UIScrollView SetContentSize 与自动布局
如何使 UIButton 与 UIScrollView 一起移动
UIScrollView 与 UINavigationBar 的动态大小