1

我想实现一个在 iPhone Game Center 应用程序中运行的抽屉。当你拉一个UITableView然后假设我们已经到达桌子的顶部有这个抽屉滑动显示更多的内容。

我在这里尝试了一些解决方案,它们都可以工作,但我无法重新创建与 Game Center 示例中相同的功能。我试图在UITableView里面嵌入一个UIScrollView- 这个滚动视图顶部有一个视图,它扮演抽屉角色,下面有一个 tableView。我UIScrollViewDelegate为我的大 scrollView 和 tableView 设置了,并设法同步了两者的 contentOffsets。我为我的大滚动视图禁用了滚动条,所以我只能从我的 tableView 中看到滚动条。

然后我尝试将 tableView 设置为整个视图的子视图并设置另一个视图 - 抽屉视图作为同一视图的子视图,并再次使用UIScrollViewDelegatetableView 来调整两个视图的框架。

两种解决方案都可以,但这不是我想要的。我认为这两种解决方案的最大缺陷是,当我拉动我的 tableView 以显示抽屉时,我可以清楚地看到我没有与我的 tableView scrollView 交互,因为在整个拖动过程中滚动条保持在同一位置的顶部。当抽屉完全展开时,我现在可以与 tableView scrollView 交互(tableView 内容滚动和滚动条正在移动)

如果您查看附加的图片,您可以看到 Game Center 应用程序中的滚动条在抽屉展开时正在移动。就像抽屉是 tableView 的滚动视图的一部分,但是当完全展开时停止移动,如果我继续拉这个 tableView,我会在 tableView 和抽屉之间获得更多空间。如果您将 tableView 向上推以隐藏抽屉,则滚动条会下降。

我想实现一个在 iPhone Game Center 应用程序中运行的抽屉。当你拉一个UITableView然后假设我们已经到达桌子的顶部有这个抽屉滑动显示更多的内容。

我想在 Game Center 中复制这样的 viewController。如果有人知道该怎么做,请分享解决方案。

您可以在此处查看屏幕截图:

http://i.stack.imgur.com/O44IS.png

http://i.stack.imgur.com/qDf7v.png

谢谢

亚当

4

2 回答 2

1

ViewController 必须实现UIScrollViewDelegate并且在scrollViewDidScroll方法内部您必须进行一些计算。下面的代码来自一个旧项目:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGFloat scrollOffset = scrollView.contentOffset.y; // this is the important number.
    if (scrollOffset>=0 && scrollOffset<=topHeight) {
        CGRect frame = CGRectMake(0, scrollOffset/2, 320, topHeight - scrollOffset/2);
        photos.frame = frame;
    } else if (scrollOffset>topHeight) {
        CGRect frame = CGRectMake(0, 100, 320, 100);
        photos.frame = frame;
    } else {
        CGRect frame = CGRectMake(0, 0, 320, topHeight);
        photos.frame = frame;
    }
}

根据您的反馈,我认为最好的选择是这样的:

|----------------------|  
|        DRAWER        |  
|----------------------|  
|                      |  
|                      |  
|                      |  
|     UIScrollView     |  
|                      |  
|                      |  
|                      |  
|----------------------|  

并在里面scrollViewDidScroll根据偏移量改变抽屉的框架。

于 2013-01-29T18:20:43.453 回答
1

我想我在 Game Center 应用程序中找到了他们的确切做法。我的解决方案的工作原理相同,并且实施起来非常简单。

首先我做了一个UITableViewController子类添加了一个UIView名为“blueView”的属性并对属性进行了一些调整tableView

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.blueView = [[UIView alloc] initWithFrame:CGRectMake(0.0, -100.0, 320.0, 100.0)];
    self.blueView.backgroundColor = [UIColor blueColor];

    [self.tableView addSubview:self.blueView];
    [self.tableView setContentInset:UIEdgeInsetsMake(100.0, 0.0, 0.0, 0.0)];
    [self.tableView setScrollIndicatorInsets:UIEdgeInsetsMake(100.0, 0.0, 0.0, 0.0)];

}

然后在- (void)scrollViewDidScroll:(UIScrollView *)scrollView方法中我正在调整视图,scrollView.contentOffset.y使其始终保持在顶部。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{

    if (scrollView.contentOffset.y < -100) {
        self.blueView.frame = CGRectMake(0.0, scrollView.contentOffset.y, 320.0, 100.0);
    } else {
        self.blueView.frame = CGRectMake(0.0, -100.0, 320.0, 100.0);
    }
}

瞧!也许这会节省一些人的时间。

于 2013-01-30T13:25:12.833 回答