我想实现一个像iPhone Game Center应用程序一样运行的抽屉。当您拉出UITableView
然后提供我们已到达桌子的顶部时,此抽屉滑动显示更多内容。
我在这里尝试了一些解决方案,所有这些解决方案都很有效但我无法重新创建与Game Center示例相同的功能。我试图在UITableView
中嵌入一个UIScrollView
- 这个滚动视图顶部有一个视图,它可以播放抽屉角色,下面有一个tableView。我为我的大scrollView和tableView设置了UIScrollViewDelegate
,并设法同步两者的contentOffsets。我已经为我的大scrollView禁用了滚动条,所以我只能从tableView中看到滚动条。
然后我尝试将tableView设置为整个视图的子视图并设置另一个视图 - 抽屉视图作为同一视图的子视图,并再次使用tableView的UIScrollViewDelegate
来调整两个视图的帧
这两种解决方案都有用,但它不是我想要的。我认为这两个解决方案的最大缺陷是,当我拉出tableView以显示抽屉时,我可以清楚地看到我没有与我的tableView scrollView进行交互,因为在整个拖动过程中,scrollBars在同一位置保持在顶部。当抽屉完全展开后,我现在可以与tableView scrollView交互(tableView内容滚动和滚动条移动)
如果您查看附加图片,您可以看到在游戏中心应用程序滚动条在抽屉展开时正在移动。这就像抽屉是tableView的scrollView的一部分,但是当完全展开停止移动时,如果我继续拉这个tableView,我会在tableView和抽屉之间获得更多空间。如果你向上推动tableView以隐藏抽屉,则滚动条会下降。
我想实现一个像iPhone Game Center应用程序一样运行的抽屉。当您拉出UITableView
然后提供我们已到达桌子的顶部时,此抽屉滑动显示更多内容。
我想在Game Center中复制这样的viewController。如果有人知道怎么做,请分享解决方案。
您可以在此处查看屏幕截图:
http://i.stack.imgur.com/O44IS.png
http://i.stack.imgur.com/qDf7v.png
由于
亚当
答案 0 :(得分: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
内,根据偏移量更改抽屉的框架。
答案 1 :(得分:1)
我想我发现他们是如何在Game Center应用程序中完成的。我的解决方案工作原理相同,实现起来非常简单。
首先,我为UITableViewController
子类添加了一个名为“blueView”的UIView
属性,并对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);
}
}
瞧!也许这会节省一些人的时间。