我在無限滾動視圖的子類中拖動視圖時遇到問題,因爲一旦調用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
,所以我必須遍歷所有父約束並檢查是否爲firstItem
或secondItem
等於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
的位置沒有影響;可是......
我的想法而已:
- 我知道,如果我創建一個全新的
appointmentView
,並直接將其添加到滾動所以它沒有鏈接到一個星期頁面,它的行爲正確沒有任何問題。這意味着如果有方法通過編程觸發UIGestureRecogniser
,我可以簡單地執行以下操作。當用戶持有appointmentView
一秒鐘後,我可以刪除舊的appointmentView
,創建一個新的並將其添加到同一位置,觸發其UIGestureRecogniser
,然後只需按照用戶的手指與新的appointmentView
。但是,如果用戶沒有從屏幕上擡起手指,我看不到這樣做的方式。 - 也許我仍然在某種程度上忘記了一些父親約束,導致
appointmentView
當它的原始父母被刪除時發瘋,但我不明白這怎麼可能。它只有4個約束條件:x座標基於頁面寬度的一小部分和約會的日期; y座標基於頁面高度的分數和約會的開始時間;寬度作爲頁面寬度的一部分;高度作爲頁面高度的一部分。我清楚地刪除所有這4,我有translatesAutoresizingMaskIntoConstraints
設置爲false - 放棄,並在邊角
任何輸入上,這將是令人難以置信的讚賞哭泣。