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 的动态大小的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 与 UIScrollView

UIScrollView SetContentSize 与自动布局

如何使 UIButton 与 UIScrollView 一起移动

UIScrollView 与 UINavigationBar 的动态大小

UITableViewCell 与 UIScrollView 防止单元格触摸

UIScrollView - 检测layoutSubviews中的滚动与方向变化?