2011-06-04 60 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