5

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

这是我的观点:它在顶部有一个 UIView,在下面有一个 UITableView。

在此处输入图像描述

当我滚动时,我希望 UIView 在特定点停止,如下所示: 在此处输入图像描述

tableView 将能够继续滚动,但 UIView 将被锁定在原地,直到用户向上滚动并将 UIView 带回其原始状态。

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

谢谢

4

6 回答 6

2

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

[self.tableView setTableHeaderView:self.headerView];

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
     return self.tableViewHeader;
}
于 2013-04-04T15:34:15.920 回答
1

将自己添加为UIScrollViewDelegateUITableView 并实现,- (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);

您将视图一个接一个地放置在滚动视图中,在表格视图之后留下所有额外的空白空间

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

于 2013-04-03T22:28:59.360 回答
0

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

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

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

于 2013-04-03T22:27:08.857 回答
0

您正在寻找的是类似于 Game Center 恰好与它的标题有关的东西,它实际上可以用表格标题、自定义部分标题视图和一些非常聪明的计算来建模,这些计算实际上从不涉及弄乱框架和边界桌子。

首先,最简单的部分:伪造一个粘性视图。该“滚动表格时始终存在的视图”实现为节标题。通过表 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实际上有一个相当出色但鲜为人知的示例,说明实现“双表视图”有多复杂。该实现具有允许“标题”表视图与“主”表视图一起滚动的额外好处。

对于未来的访问者,我已经实现了一个更简单的版本,尽管它使用 Reactive Cocoa 实现了目标,并且有一点不同的结果。即便如此,我相信这可能是相关的。

于 2013-04-04T03:33:52.447 回答
0

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

(UITableViewHeaderFooterView *)headerViewForSection:(NSInteger)section
{
   return bottomView;
}
于 2013-04-04T05:11:32.480 回答
0

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

  1. 将您的视图设置为 UITableView 的标题视图。然后将您当前的视图添加到标题视图。
  2. 完成- (void)scrollViewDidScroll:(UIScrollView *)scrollView;。Tn 检查滚动视图的内容偏移量的功能,并设置当前视图的框架。
于 2013-09-03T15:41:47.243 回答