DC2*_*DC2 0 iphone uitableview uiscrollview ipad ios
我试图获得沿弯曲路径滚动 uitableview 的效果。基本上它就像屏幕一侧的凸出的tableview,就好像它是一个大圆圈的一侧。我不想使用图形效果来扭曲 tableview,因为文本会变得更难阅读。
顶部和底部的项目比靠近中心的对象更靠近屏幕边缘。
这是我想出的。这里非常粗略的演示作为概念证明。
首先,与 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 次,在没有可见更改时重做所有内容,因此许多详细项目可能无法经常刷新。
享受。
| 归档时间: |
|
| 查看次数: |
1583 次 |
| 最近记录: |