根据UITableView调整UIScrollView高度

时间:2013-04-03 22:00:32

标签: ios objective-c uitableview uiscrollview

我有一个UIScrollView,它包含一个UIView和一个UITableView。我的目标是调整UIScrollView的高度,以允许我将UIScrollView的内容滚动到特定点。

以下是我的观点:它有一个UIView up top和一个UITableView下面。

enter image description here

当我滚动时,我希望UIView停在特定点,如下所示: enter image description here

tableView将能够继续滚动,但UIView将被锁定到位,直到用户向上滚动并将UIView恢复到其原始状态。

我尝试做的一个主要示例是iOS 6上的AppStore.app。当您查看应用程序的详细信息时,详细信息,评论和相关的过滤器栏移动到屏幕顶部并停止。我希望这一切都有道理。

由于

6 个答案:

答案 0 :(得分:2)

我最终采用了更简单的方法。我不敢相信我之前没有看到这个。我创建了两个视图,一个用于UITableView的tableHeaderView,另一个用于viewForHeaderInSection。我希望始终保持可见的视图放在viewForHeaderInSection方法中,另一个视图放在tableHeaderView属性中。我认为这比使用scrollview更简单。我用这种方法遇到的唯一问题是这两个视图中的所有UIView动画都不再具有动画效果。 这是我的代码。

[self.tableView setTableHeaderView:self.headerView];

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
     return self.tableViewHeader;
}

答案 1 :(得分:1)

将自己添加为UIScrollViewDelegate到UITableView并实施- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView,这样如果您的观看次数位于初始位置,则会执行以下操作:

- 您的UITableView将其大小设置为第二个状态:

 [UIView animateWithDuration:.1f animations:^{
      CGRect theFrame = myView.frame;
      theFrame.size.height += floatOfIncreasedHeight;
      myView.frame = theFrame;
    }];

- 您的UIView动画显示其垂直移动

 [UIView animateWithDuration:3 delay:0 options:UIViewAnimationOptionCurveLinear animations:^(void){
        view.center = CGPointMake(view.center.x , view.center.y + floatOfVerticalMovement);
        }completion:^(BOOL Finished){ 
        view.center = CGPointMake(view.center.x , view.center.y - floatOfVerticalMovement);]

最后总是在委托工具– scrollViewDidScrollToTop:中,以便您知道可以动画回到初始状态(使用相反的技术反转)。

<强>更新

因为您的视图位于滚动视图中,所以如果您可以更好地使用表视图在起始位置部分超出界限(即不是更改大小,只是滚动到视图中):

使滚动视图框架大小与最终tableview +您的初始(整个)视图一样大,并将其放置在0,0(因此其最终部分将隐藏在屏幕之外)

scrollview.frame = CGRectMake(0,0,tableview.frame.size.width,tableview.frame.size.height + view.frame.size.height);

使容器scrollview的内容与整个表视图一样大+整个视图+滚动表视图时想要的视图量。

scrollview.contentSize = CGSizeMake(scrollview.frame.size.width, tableview.frame.size.height + view.frame.size.height + floatOfViewHeightIWantOutOfTheWay);

将视图一个接一个地放在scrollview中,在表视图之后留下所有额外的空白区域

view.frame = CGRectMake(0,0,view.frame.size.width, view.frame.size.height);

tableview.frame = CGRectMake(0,view.frame.size.height, tableview.frame.size.width, tableview.frame.size.height);

现在它应该正常工作,因为支持iOS 3嵌套scrolling

答案 2 :(得分:0)

您可以通过正确设置scrollView的内容大小并保持UITableView的高度小于viewcontroller的高度来轻松实现这一点,以便它适合顶部UIView和UITableView的底部...

另一种情况是将顶部视图分为两部分。 将滚动的部分和可见的部分。

然后设置将作为整个UITableView标题滚动的部分以及将作为第一个表部分的标题视图保持可见的部分。 因此,您可以使用单个UITableView实现此目的,而无需使用UIScrollView

答案 3 :(得分:0)

你正在寻找的东西就像游戏中心碰巧用它的标题做的事情,它实际上可以用表头,自定义部分标题视图和一些非常聪明的计算来建模,这些计算实际上从未涉及到框架的混乱和桌子的界限。

首先,简单的部分:伪造粘性视图。 “滚动表时始终存在的视图”实现为节头。通过创建表1中的部分数量并实现-headerViewForSection:,可以使用tableview无缝地使视图滚动全部免费(API原则):

- (UITableViewHeaderFooterView *)headerViewForSection:(NSInteger)section {
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0,0,320,50)];
    label.text = @"Info that was always present when scrolling the UITableView";
    label.textAlignment = UITextAlignmentCenter;
    label.backgroundColor = [UIColor colorWithRed:0.243 green:0.250 blue:0.253 alpha:1.000];
    label.textColor = UIColor.whiteColor;
    return label;
}

最后,困难的部分:KVO。当表格滚动时,我们必须将标题保持在视图框架顶部的粘性,这意味着您可以使用KVO contentOffset,并使用结果更改值来近似视图的框架应该坚持一点MIN()魔法。假设您的标题高44像素,下面的代码计算适当的帧值:

CGPoint offset = [contentOffsetChange CGPointValue];
[self.tableView layoutSubviews];
self.tableView.tableHeaderView.frame = CGRectMake(0,MIN(0,offset.y),CGRectGetWidth(self.scrollView.frame),44);

如果上述情况不可行,SMHeadedList实际上有一个相当大的,鲜为人知的例子,说明实现“双表视图”的复杂程度。该实现还具有允许“标题”表视图使用“主”表视图滚动的附加好处。

对于未来的访问者,我已经实现了一个much simpler version,虽然它实现了Reactive Cocoa的目标,并且有一些不同的结果。即便如此,我相信这可能是相关的。

答案 4 :(得分:0)

如果你将UIView分成顶部和底部怎么办?底部将是信息 在UITableView.tableHeaderView = topView中设置viewDidLoad 并在委托方法中返回bottomView作为Section Header使其浮动:

(UITableViewHeaderFooterView *)headerViewForSection:(NSInteger)section
{
   return bottomView;
}

答案 5 :(得分:0)

只需使用UITableView就可以解决您的问题。它不需要使用另一个滚动视图。

  1. 将您的视图设置为UITableView的标题视图。然后将您当前的视图添加到标题视图中。
  2. 完成- (void)scrollViewDidScroll:(UIScrollView *)scrollView;。用于检查滚动视图的contentoffset的函数,并设置当前视图的框架。