2016-11-02 16 views
0

我在無限滾動視圖的子類中拖動視圖時遇到問題,因爲一旦調用viewWillLayoutSubviews方法,視圖就會卡在0,0座標上。這是完整的圖片:在無限UIScrollView中跨頁面拖動視圖

我有一個UIScrollView(啓用分頁功能)的自定義子類,它保持一個索引,並且每當它滾動時,就會向它的dataSource請求一個給定索引的新視圖。它始於[-1][0][1],用戶只能看到[0]。一旦用戶向右滾動,[-1]從超級視圖中移除,[0][1]已移動並且頁面[2]生成爲給出[0][1][2]。這是完美的,因爲我將它用作無限滾動的日曆。在這個日曆中,我希望能夠在幾個星期內拖拽約會。這是通過使用UIGestureRecogniser - 用戶持有1秒的約會視圖觸發UIGestureRecogniser,然後我使用[gesture locationInView:self]來更新約會視圖的位置。

當用戶拖到視圖的旁邊時,滾動會移動以顯示下一頁。由於約會視圖是他們所屬頁面的子視圖,這意味着我需要將約會移動到滾動本身([scroll addSubview:appointmentView];),這使UIGestureRecogniser運行良好。但是,由於約會視圖的原始位置是使用自動佈局給出的,因此我不能使用[appointmentView removeFromSuperview];去除父約束,因爲它會阻止UIGestureRecogniser,所以我必須遍歷所有父約束並檢查是否爲firstItemsecondItem等於appointmentView。同樣,當在原始頁面內滾動時,這種方式效果很好,儘管appointmentView現在是滾動的子視圖而不是頁面。

此時,用戶將appointmentView拖到一邊,我的滾動條移動以顯示下一週(每頁顯示一週)。然而,這一次,appointmentView briefly移動到(0,0)秒,但UIGestureRecogniser仍在工作,所以如果我繼續移動我的手指,appointmentView將返回到在屏幕上移動。此時,假設appointmentView來自第0頁,其頁面位於左側,居中頁面位於第1頁 - [0][1][2]

最後來這裏的問題:如果用戶移動1周進一步向權,appointmentView的原始頁面(0)被移除,現在滾動顯示[1][2][3]和appointmentView跳轉到滾動(0,0)UIGestureRecogniser立即終止而不通過其狀態爲UIGestureRecogniserStateEnded的選擇器。

我99.9%確定沒有剩餘的父母約束將appointmentView鏈接到其原始父頁面0,這意味着我不知道爲什麼刪除頁面0會導致此行爲。 appointmentView只對自身(寬度和高度)及其子視圖(視圖中的標籤)有約束,這意味着佈置視圖應該對appointmentView的位置沒有影響;可是......

我的想法而已:

  1. 我知道,如果我創建一個全新的appointmentView,並直接將其添加到滾動所以它沒有鏈接到一個星期頁面,它的行爲正確沒有任何問題。這意味着如果有方法通過編程觸發UIGestureRecogniser,我可以簡單地執行以下操作。當用戶持有appointmentView一秒鐘後,我可以刪除舊的appointmentView,創建一個新的並將其添加到同一位置,觸發其UIGestureRecogniser,然後只需按照用戶的手指與新的appointmentView。但是,如果用戶沒有從屏幕上擡起手指,我看不到這樣做的方式。
  2. 也許我仍然在某種程度上忘記了一些父親約束,導致appointmentView當它的原始父母被刪除時發瘋,但我不明白這怎麼可能。它只有4個約束條件:x座標基於頁面寬度的一小部分和約會的日期; y座標基於頁面高度的分數和約會的開始時間;寬度作爲頁面寬度的一部分;高度作爲頁面高度的一部分。我清楚地刪除所有這4,我有translatesAutoresizingMaskIntoConstraints設置爲false
  3. 放棄,並在邊角

任何輸入上,這將是令人難以置信的讚賞哭泣。

回答

0

我設法解決了這個問題,原始父視圖發佈時發生問題,所以我只是在整個移動過程中將其保留在變量中,並在拖動完成後將其釋放。