沿曲线滚动

DC2*_*DC2 0 iphone uitableview uiscrollview ipad ios

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

顶部和底部的项目比靠近中心的对象更靠近屏幕边缘。

DC2*_*DC2 5

这是我想出的。这里非常粗略的演示作为概念证明。

首先,与 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
Run Code Online (Sandbox Code Playgroud)

}

这会将项目与全局 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++;
    }
}
Run Code Online (Sandbox Code Playgroud)

}

这基本上使用正弦波将可见范围内的每个项目滑过适当的数量。所以顶部和底部的项目几乎没有调整,中间的项目被移得最远。就像半个正弦波侧身。

它实际上运行得非常流畅,就像在我的第一代 iPad 上一样。我真的很喜欢它。一些加快速度的方法...准确计算内容区域中的视图并只触摸那些视图,现在我正在从头到尾检查每个项目,这是一种浪费。此外,预缓存 sin() 值可能是值得的。另一件事是 scrollViewDidScroll 可以在同一位置更新 2 或 3 次,在没有可见更改时重做所有内容,因此许多详细项目可能无法经常刷新。

享受。