2

我有一个 iPad 应用程序(XCode 4.6.3、iOS 6.2、ARC 和 Storyboards),它在其中一个场景的下半部分具有以下结构(所有网格都是 UIView,SubViewData 也是如此)。

在此处输入图像描述

目的是拥有看起来像电子表格的东西;我需要能够水平滚动并且左侧网格将保持锁定,如果我垂直滚动,顶部网格将保持锁定。

这是它现在的样子,没有滚动(右边和下面还有更多):

在此处输入图像描述

更新: 这是定义 UIViews 的代码:

不得不使用图像,因为我无法正确格式化

我查看了 SO 和 Google 并没有找到这样的例子。有人可以告诉我我需要更改什么才能使此代码正常工作,或者给我一些好的文档,我可以在其中获得有关contentOffset的详细信息吗?(我已经看过 UIScrollView 了,没用!)

已解决- 它现在正在工作......这就是我在 Fogmeister 的帮助下让它工作的方式:

  • 创建了一个单独的顶行和左行 UIView 来保存网格小时和员工姓名
  • 在 UIScrollViews 中嵌入了那些新的 UIViews(编辑器 -> 嵌入在滚动视图中)
  • 按照 Fogmeister 关于代码的说明进行操作。

这是新的结构:

在此处输入图像描述

这是实现它的代码:

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

CGPoint mainOffset = [scrollView contentOffset];
NSLog(@"\n\nmainOffset.x: %f\nmainOffset.y: %f", mainOffset.x, mainOffset.y);

// set the horizontal offset of the main view onto the column headers
[self.topGridSV setContentOffset:CGPointMake(mainOffset.x, 0)];
if(mainOffset.x < 0)  {
    [self.topGridSV setContentOffset:CGPointMake(0, 0)];
    [self.schedScrollView setContentOffset:CGPointMake(0, 0)];
}

// set the vertical offset onto the row headers
[self.leftGridSV setContentOffset:CGPointMake(0, mainOffset.y)];
if(mainOffset.y < 0)  {
    [self.leftGridSV setContentOffset:CGPointMake(0, 0)];
    [self.schedScrollView setContentOffset:CGPointMake(0, 0)];
}
4

1 回答 1

3

好的,我这样做的方法是将“标题”行和列移动到他们自己的滚动视图中。

因此,您将在中间有一个滚动视图,其中包含实际的单元格。

然后,您将在顶部看到一个仅包含列标题的滚动视图。

然后在左侧有一个滚动视图,它只包含行标题。

现在,让“拥有”视图控制器成为“主”滚动视图的代表,其中包含单元格。

所以你会有...

UIScrollView *cellScrollView;
UIScrollView *columnHeaderScrollView; // along the top
UIScrollView *rowHeaderScrollView; // down the left

您必须相应地设置内容。显然,您不希望 cellScrollView 中的标题。ETC...

现在,在委托方法中......

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    // scrollView here should always be == self.cellScrollView
    // as this is where the delegate method is triggered from.

    CGPoint *mainOffset = [scrollView contentOffset];

    // set the horizontal offset of the main view onto the column headers
    [self.columnHeaderScrollView setContentOffset:CGPointMake(mainOffset.x, 0)];

    // set the vertical offset onto the row headers
    [self.rowHeaderScrollView setContentOffset:CGPointMake(0, mainOffset.y)];
}

像这样的东西应该很容易得到你想要的效果。

带有一个滚动视图

您将拥有滚动视图的三个子视图以及对这些子视图的引用...

cellView
leftView
topView

这些都是 UIView 的子类。

最初,您将拥有类似...的布局

leftView frame == [0, 50, 80, some long height]
topView frame == [80, 0, some long width, 50]
cellView frame == [80, 50, some long width, some long height]

即单元格视图将按顶视图的高度和左视图的宽度缩进。(我希望这是有道理的)。

所以在你的 scrollViewDidScroll ...

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    // we will transform the position of the top view and left view using the offset.
    // I chose a transform as it always acts from the original position.
    // changing the view's frame will make it difficult to set it back again.

    CGPoint offset = [scrollView contentOffset];

    // move the left view to the left and right depending on the offset
    leftView.transform = CGAffineTransformMakeTranslation(offset.x, 0);
    // up and down is taken care of by the scroll view correctly.

    // move the top view up and down depending on the offset
    topView.transform = CGAffineTransformMakeTranslation(0, offset.y);
    // left and right is taken care of by the scroll view correctly.
}

我选择使用转换,因为它使计算更容易。无需每次尝试计算所需的位置差异,只需将变换量设置为偏移量即可。

于 2013-07-02T16:02:45.427 回答