我有一个iPad应用程序(XCode 4.6.3,iOS 6.2,ARC和Storyboards),其中一个场景的下半部分具有以下结构(所有网格都是UIViews,SubViewData也是如此)。 p>
目的是让某些内容看起来像电子表格;我需要能够水平滚动,左网格将保持锁定状态,如果我垂直滚动,顶部网格将保持锁定状态。
这就是现在的样子,没有滚动(右边有更多,也有向下):
UPDATE:这是定义UIViews的代码:
我查看了SO和Google,没有找到这方面的例子。有人可以告诉我需要更改什么才能让这些代码正常工作,或者给我一些好的文档,我可以获得 contentOffset 的详细信息? (我已经阅读过UIScrollView,没有任何帮助!)
已解决 - 现在正在运作......在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)];
}
答案 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.
}
我选择使用变换,因为它使计算更容易。您不必尝试计算每次所需的位置差异,而只需将变换量设置为偏移量即可。