[英]How to make UIScrollView inside a UIScrollView act simultaneously
我使用的是UIScrollView( UIScrollView_1 ),啟用了分頁,可以在3個頁面之間水平移動。
在最后一頁上有多個UIScrollViews(每個UIScrollViews在其自己的單元格中)( UIScrollView_2 ),當向右水平滾動(向前)時,將顯示最后一頁(相應地加載到要滾動的單元格)。
但是,如果向左滾動(向后滾動),我希望UIScrollView_1接管並向后滾動。
如果我向上移動手指並注冊一個新的觸摸事件,它將按預期工作。 但是我希望它在同一平底鍋上的兩個UIScrollView之間同時動作。
|-------------UIScrollView_1----------|
| Page_1 | Page_2 |--UIScrollView_2---|
..................|...Page_3|Page_4...|
我想要的是利用UIGestureRecognizerDelegate中的shouldRecognizeWithWith。
但是,當我嘗試將兩個UIScrollViews委派給同一個ViewController時,錯誤“ UIScrollView的內置平移手勢識別器必須將其滾動視圖作為其委派。” 顯示在ScrollView_2上。
關於如何解決這個問題的任何想法?
更新
這是page_3的UIViewController中的cellForRow,它不會導致委派錯誤,但是UIScrollViews不能同時起作用。 (例如,需要上下移動手指以檢測其他UIScrollView。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "random", for: indexPath)
return cell
}
這是cellForRow,導致“ UIScrollView的內置平移手勢識別器必須以其滾動視圖作為其委托。”-錯誤
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "random", for: indexPath)
let scrollView_1_VC = self.parent
cell.scrollView_2.panGestureRecognizer.delegate = scrollView_1_VC
return cell
}
我解決了
必須將UIScrollView的內置UIPanGestureRecognizer委托給它自己的UIScrollView,因為錯誤“ UIScrollView的內置平移手勢識別器必須將其滾動視圖作為其委托。” 說過。
而是子類化UIScrollView並創建第二個UIPanGestureRecognizer,然后與內置的UIPanGestureRecognizer同時操作。
步驟1-4:
子類化單元的UIScrollView並創建第二個UIPanGestureRecognizer。
將UIGestureRecognizerDelegate添加到CellScrollView,並使shouldRecognizeSimultaneouslyWith返回true。
現在,第二個UIPanGestureRecognizer將與內置的UIPanGestureRecognizer同時運行。
類CellScrollView:UIScrollView,UIGestureRecognizerDelegate {
var panGesture : UIPanGestureRecognizer! override func awakeFromNib() { panGesture = UIPanGestureRecognizer.init(target: self, action: nil) addGestureRecognizer(panGesture) } func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { return true }
}
在cellForRow中,將新創建的UIPanGestureRecognizer委托給UIScrollView_1的UIViewController。
func tableView(_ tableView:UITableView,cellForRowAt indexPath:IndexPath)-> UITableViewCell {
if medicines.isEmpty { return tableView.dequeueReusableCell(withIdentifier: "emptyMedCell", for: indexPath) } let cell = tableView.dequeueReusableCell(withIdentifier: "random", for: indexPath) let scrollView_1_VC = self.parent cell.cellScrollView.panGesture.delegate = scrollView_1_VC return cell
}
最后,在ScrollView_1的UIViewController中,讓shouldRecognizeSimultaneouslyWith返回true。
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { return true
}
我想你想使用類似
func gestureRecognizer(UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer:UIGestureRecognizer) -> Bool {
if page3 {
return true
}
}
在ScrollView_2的UIViewController上,並將ScrollView_2(而不是手勢的)委托作為ViewController,
ScrollView_2.delegate = self
UIPanGesture.delegate = ScrollView_2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.