2011-06-04 63 views
0

我试图获得沿着弯曲路径滚动uitableview的效果。基本上它就像屏幕边上的凸出的桌面视图,就好像它是一个大圆圈的一边。我不想使用图形效果来扭曲tableview,因为文本会变得更难阅读。沿曲线滚动

顶部和底部的项目比靠近中心的物体更接近屏幕边缘。

+0

是否这样? http://www.gamecabinetsinc.com/images/ddr3.jpg – 2011-06-04 17:00:46

+0

是的,这就是主意。 – DC2 2011-06-04 17:51:01

回答

4

这是我想出来的。这里非常粗略的示范作为概念验证。

首先与myScrollView的连接已经使用IBOutlet进行设置,并挂接到xib中的滚动视图。 后来我成立viewDidLoad中滚动视图:

int scrollItems = 20; 
viewSize = 120; 
viewItems = [[NSMutableArray alloc] init]; 
[myScrollView setContentSize:CGSizeMake(myScrollView.frame.size.width, (viewSize*1.25)*scrollItems)]; 
for(int i = 0; i < scrollItems; i++){ 
    UIView *thisView = [[UIView alloc] initWithFrame:CGRectMake(myScrollView.frame.size.width/2, i*(viewSize*1.25), viewSize, viewSize)]; 
    [thisView setBackgroundColor:[UIColor blueColor]]; // spaced out blue squares 
    [myScrollView addSubview:thisView]; 
    [viewItems addObject:thisView]; 
} 
[myScrollView setDelegate:self]; 
[myScrollView setContentOffset:CGPointMake(0, 1)]; // to force initial items to curve 

}

这使具有全球NSMutableArray的沿滚动型的项目。它们均匀分布,滚动视图的大小正确。现在这些项目大致排列在我的滚动视图的中间。给他们一个曲线添加下面的方法:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{ 
float start = [scrollView contentOffset].y;  
float height = scrollView.frame.size.height; 
float end = start + height; // change so it doesn't scoot views past the end 

float viewOffset, viewTop; 

int index = 0; 
for(UIView *thisView in viewItems){ 
    viewTop = thisView.frame.origin.y+thisView.frame.size.height; 
    if((viewTop>start)&&(thisView.frame.origin.y<end)){ // our visible range 
     viewOffset = thisView.frame.origin.y - start; 
     CGRect tempFrame = thisView.frame; 
     tempFrame.origin.x = 90 - sin((viewOffset/height)*4)*80; 
     thisView.frame = tempFrame; 
     index++; 
    } 
} 

}

这基本上采用了正弦波在由适量飞奔在可见光范围内的每个项目。所以顶部和底部的物品几乎没有任何调整,并且中央物品被最远地扫过。就好像半个正弦波一边转了一边。

它在我的第一代iPad上运行得非常流畅。我非常喜欢它。有几种方法可以加快速度......准确计算哪些视图在内容区域中,只需触及这些视图,现在我正在检查每个项目从头到尾,这是浪费。预先传送sin()值也许是值得的。另一件事是scrollViewDidScroll可以在相同的位置更新2到3次,当没有可见的更改时重做所有内容,因此许多详细项目可能无法经常刷新。

享受。

+0

感谢这段代码。但你是如何找到这些数字的? (tempFrame.origin.x = 90 - sin((viewOffset/height)* 4)* 80) – Stan 2014-05-08 08:54:44

0

我在想你需要一个自定义类,核心动画。我不知道如何制作贝塞尔曲线,但基本上你需要一个装满了5个单元格视图的整体视图容器。如果向上移动,顶部视图是'removeFromSuperview-ed',并在底部添加一个新单元格。其他四个单元格将动画到贝塞尔曲线上的下一个定义位置。不要太难,我认为你需要弄清的最多的是:

曲线动画 - 用x和y移动UIViews,根据x的移动来缩放视图(越小越往上走或向下曲线)

功能加减细胞

一个函数来显示/内容添加到每个小区

移动单元向上和向下

函数理想地,这将是自我包容。看看你是否可以像教程那样找到一个自定义的封面流程,我认为这与另一个动画相似。

+0

我宁愿不改造整个tableview概念,对我来说好像很多工作。也许有一种方法可以将屏幕上的每个单元格向左滚动,然后向右滚动,然后我仍然可以使用tableview。 – DC2 2011-06-05 22:09:30

+0

@ XenElement:嗨,谢谢你的发帖。它让我想到除了UITableView之外的其他东西。我已经有了一个基本的工作原型,现在有了一个UIScrollview。我打算把它清理一下,然后在这里张贴并标记它解决。 – DC2 2011-06-06 15:54:25

+0

太棒了!甚至没有考虑使用滚动视图。恭喜你让它工作!此外,它看起来像一个有用的框架/对象,所以如果你有机会发布它,就去做吧。 – 2011-06-06 18:58:57