我基本上试图实现以下可滚动布局,并且正在寻找一些关于实现它的最佳方法的建议......
潜在的解决方案可能是......
我已经考虑让所有'A'组件成为父UITableView中单行的一部分,行A1,A2和amp;孩子UITableView中的A3,但我不确定这是否可能?
我也不确定它是否可以有一个UITableView,但是跨越多行的区域(例如你可以在HTML表格中做)。然后区域A,B,C等可以是跨越各自行的视图。
任何建议表示赞赏。
答案 0 :(得分:3)
这是完全可行的,但我强烈建议不要嵌套UITableViews或UIScrollViews,这可能会导致滚动时出现一些非常重要的性能问题(UITableViews不会自动重用),并且肯定会是一个混乱的,可能是错误的解决方案。
最好的方法是创建自定义UITableViewCells,根据给定的数据绘制自己。然后他们可以画出看起来像你上面描述的细胞,给出多个细胞的外观,尽管每个部分实际上都是一个细胞。
通过将单元格选择样式设置为NONE并在单元格上侦听触摸事件,您甚至可以选择单独的“子单元格”。
这是一个非常复杂的绘图,所以我建议看看其他人是如何做到的。 http://blog.atebits.com/2008/12/fast-scrolling-in-tweetie-with-uitableview/ http://cocoawithlove.com/2010/12/uitableview-construction-drawing-and.html/
这就是我处理它的方式: https://github.com/andrewzimmer906/XCell
答案 1 :(得分:1)
上面的GUI绝对可以实现,但实际上我从未在任何应用程序中看到过。无论如何,如果你还没有完成,你可以试试。
最佳选择是最初使用数据A,B,C,D加载一个表。然后当用户选择例如A中的任何一行时,然后重新加载表并将A放入节标题和A1 A2等数据中。在这种情况下,您必须编写大量代码来处理表的状态,但它看起来不错。
您可以自定义UITableViewCell并在其中排列UIView以实现您的模式。所有你必须知道的是如何产生ROW的高度。它可以在委托方法heightForRowAtIndexPath中设置。
如果您想要跨越的行(具有A1,B1等的行)进行滚动,您可以通过在滚动视图内部排列表格或在滚动视图内部滚动查看来实现它。
答案 2 :(得分:1)
感谢所有的回复,我已经投了他们,因为他们很有帮助但是我没有接受他们作为答案,因为我实际上实现了一个完全不同的解决方案,建议使用UITcViewView下UIScrollView的组合如下。请注意,没有嵌套或跨越。
UITableView的委托被设置为UIViewController。 UIScrollView的委托未设置。
当用户滚动UITableView时,它的scrollViewDidScroll
方法被触发,我可以在代码中手动滚动UIScrollView相同的数量,如下所示......
- (void)scrollViewDidScroll:(UIScrollView *)tableView
{
[self.scrollView setContentOffset:tableView.contentOffset animated:YES];
}
当页面加载A,B,C等元素的位置以及滚动视图的确切高度以便它与UITableView匹配时,我必须有点聪明才能计算(在代码中)。
由于我使用标准的UITableView用于A1,A2,B2,C3等,当用户选择一行并仍然可以免费获得标准的UITableView高亮显示时,我能够轻松控制动作。
<强>缺点强>
在UIScrollView上滑动/滚动无效,您必须在UITableView上滚动。我可以通过在UIScrollView上实现委托并对其自己的scrollViewDidScroll
方法做出反应来滚动UITableView来解决这个问题,但我还没有尝试过这个,我希望它们会成为问题,因为这两种方法都是同时开火。
触摸/点击UIScrollView无效。这对我的需求很好,但如果我想执行一些动作,我可以使用之前完成的UITapGestureRecognizer。 E.g。
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureCaptured:)];
[self.scrollView addGestureRecognizer:tapRecognizer];
- (void)tapGestureCaptured:(UITapGestureRecognizer *)touch
{
CGPoint touchPoint=[touch locationInView:scrollView];
// Perform action here.
}
希望这有助于某人。再次感谢。