如何在滚动时使UIScrollView锁定3个UIView中的2个?

时间:2013-07-02 15:49:59

标签: ios objective-c uiscrollview

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

enter image description here

目的是让某些内容看起来像电子表格;我需要能够水平滚动,左网格将保持锁定状态,如果我垂直滚动,顶部网格将保持锁定状态。

这就是现在的样子,没有滚动(右边有更多,也有向下):

enter image description here

UPDATE:这是定义UIViews的代码:

Had to use an image because I couldn't get it formatted correctly

我查看了SO和Google,没有找到这方面的例子。有人可以告诉我需要更改什么才能让这些代码正常工作,或者给我一些好的文档,我可以获得 contentOffset 的详细信息? (我已经阅读过UIScrollView,没有任何帮助!)

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

  • 创建了一个单独的顶行和左行UIView来保存网格小时和员工姓名
  • 在UIScrollViews中嵌入那些新的UIViews(编辑器 - >嵌入滚动视图)
  • 遵循Fogmeister的指示,关于实现它的代码。

这是新结构:

enter image description here

这是实现它的代码:

- (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)];
}

1 个答案:

答案 0 :(得分:3)

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

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

然后你将在顶部有一个滚动视图,它只包含列标题。

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

现在,使“拥有”视图控制器成为“主”scrollView的委托,其中包含单元格。

所以你会......

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

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

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

- (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.
}

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