2012-03-18 160 views
6

我試圖創建某種類似於視頻編輯器的時間線視圖:連續的媒體元素,它們是UIView的。我可以使用UIScrollView觸摸事件(如touchesBegantouchesMoved)成功拖動滾動視圖當前可見部分內的這些視圖。一旦子視圖被拖動到其中一個滾動視圖邊緣,我想滾動滾動視圖。我現在能想到的最好的方法是創建一個計時器,當用戶用手指在滾動視圖邊緣附近握住子視圖時,該計時器將滾動視圖。如何通過滾動邊緣來拖動UIScrollView中的視圖?

這裏有很多關於同一主題的問題,但我無法找到一個涵蓋滾動的問題。

有沒有做到這一點的好辦法?我應該使用手勢識別器嗎?

預先感謝您。

+0

你可以得到觸摸的位置,如果它在「邊緣區域」遞增/遞減scrollOffSet,應該使它看起來滾動 – 2012-03-18 19:20:14

+0

這就是我現在正在做的,但我不喜歡結果,動畫是生澀的,代碼似乎不可靠,因爲它取決於計時器。 – anticyclope 2012-03-19 02:54:56

回答

8

其實你想要的是一個定時事件。一旦用戶處於滾動視圖的邊緣,您就會啓動一個定時器,該定時器會定期增加contentOffset。如果你不喜歡你的動畫效果(我想你使用的是setContentOffset:animated:?),試試另一個動畫的時間和距離。我想你必須嘗試一些不同的設置。我會首先嚐試的是1px。也許每0.3秒?

如果這不起作用,你也可以嘗試另一個「極端」。當用戶到達邊緣時,開始一個動畫,該邊緣動畫contentOffset直到contentSize結束。但是在很大的時間段內,運動速度很慢。如果用戶停止拖動或移出邊緣,請在當前位置停止動畫。這甚至會是沒有計時器的解決方案,因爲動畫本身就是你的計時器。

+0

其實,我必須關閉現在這個賞金,因爲我已經以你在第一段描述的方式實施它(這也是我的第一個想法)。主要問題是將此行爲集成到我的滾動視圖子類中,因爲其子視圖像表視圖中的單元格一樣被緩存。無論如何,即使有計時器,我也很高興。 我認爲你可以給你的答案添加一些點,比如,在動畫過程中如何更新當前拖動視圖的位置(在滾動視圖滾動時保持在手指下),所以答案將會完整,獎勵將是你的:) – anticyclope 2012-03-24 21:53:49

+0

實際上這裏問的問題並不是關於scrollview中的實際拖動 - 有不同的方法。我會參考這裏的搜索,或者那個問題:http://stackoverflow.com/questions/9715582/iphone-ios-how-to-implement-drag-and-drop-for-subviews-of-a-scrollview/9844006#9844006 – calimarkus 2012-03-24 22:03:32

+0

拖動是不成問題的在這裏,但保持視圖穩定,而底層滾動視圖用動畫滾動並不清楚,可能是因爲我還沒有嘗試。 – anticyclope 2012-03-24 22:06:49

0

我認真地懷疑手勢識別器會是這個方法的一個很好的解決方案的一部分,因爲它們往往對謹慎的手勢最有幫助。

根據上面所暗示的假設,我不認爲我可以改進您的總體方向,即您正在尋找連續/逐步滾動。

我的建議是,你考慮設計這個使用分頁滾動的方法。當用戶將對象拖動到滾動視圖的邊緣時,使滾動視圖沿該方向移動一個頁面(通過將contentOffset設置爲根據滾動視圖的邊界向該方向移動)。當發生這種情況時,將對象略微移出滾動視圖邊緣的「熱區」,以便用戶不得不明確表示他們想要移動另一個頁面,或沿着這些行移動 - 也就是說,自從設計方法依賴於這個「分頁事件」,你需要爲用戶實現某種手勢系統來保持分頁。

我想你可以在同樣的情況下使用一個計時器,這樣如果用戶維持位置並觸摸另一秒鐘,你會再次頁面。

+1

這就是沒有勝利..你還有一個計時器..實際上它是一個非常糟糕的解決方案,如果你想到一個視頻編輯器。分頁在這裏不會有幫助。此外,如果您重新定位處於拖動狀態的對象,它的用戶體驗不佳...... – calimarkus 2012-03-24 21:21:02

+0

某些手勢識別器實際上可以。如果您使用長按手勢識別器,如果在長按「踢入」後拖動,則會獲得位置更新。我成功地使用它來實現拖拽作爲長按的一部分(即長按一次,然後在長按確認後開始拖動)。 – occulus 2012-04-24 08:48:49

+0

剛剛添加 - 我可能會在某些時候修改這種方法,因爲一個弱點是,如果用戶的手指/指針在長按期間甚至略微移動,它不會被識別爲長按... – occulus 2012-04-24 09:21:06

相關問題