如何使 UIScrollView 内的 UIScrollView 同时动作
How to make UIScrollView inside a UIScrollView act simultaneously
我正在使用启用分页的 UIScrollView (UIScrollView_1) 以在 3 个页面之间水平移动。
在最后一页上有多个 UIScrollViews(每个在它自己的单元格中)(UIScrollView_2),当水平向右(向前)滚动时显示最后一页(加载相应地滚动到哪个单元格)。
但是如果向左(向后)滚动,我希望 UIScrollView_1 接管并向后滚动。
如果我向上移动手指并注册一个新的触摸事件,这将按预期工作。但我希望它在同一个面板上的两个 UIScrollView 之间同时运行。
|-------------UIScrollView_1----------|
| Page_1 | Page_2 |--UIScrollView_2---|
..................|...Page_3|Page_4...|
我想要的是利用 UIGestureRecognizerDelegate 中的 shouldRecognizeSimultaneouslyWith。
但是,当我尝试将两个 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
}
这是导致 'UIScrollView 的内置平移手势识别器必须将其滚动视图作为其委托的 cellForRow。'-error
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
}
我想你想使用类似
的东西
func gestureRecognizer(UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer:UIGestureRecognizer) -> Bool {
if page3 {
return true
}
}
在 ScrollView_2 的 UIViewController 上,将 ScrollView_2 的(不是手势的)委托作为 ViewController、
ScrollView_2.delegate = self
UIPanGesture.delegate = ScrollView_2
我解决了。
UIScrollView
's built-in UIPanGestureRecognizer
must be delegated to its own UIScrollView
as the error 'UIScrollView's built-in pan gesture recognizer must have它的滚动视图作为它的委托。' 说。
相反,子类化 UIScrollView
并创建第二个 UIPanGestureRecognizer
,然后它与内置的 UIPanGestureRecognizer
.
同时起作用
第 1 - 4 步:
子类单元格的 UIScrollView
并创建第二个 UIPanGestureRecognizer
.
将 UIGestureRecognizerDelegate
添加到 CellScrollView
并使 shouldRecognizeSimultaneouslyWith
return true
.
第二个 UIPanGestureRecognizer
现在将与内置的 UIPanGestureRecognizer
.
同时作用
class 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 return 为真。
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
我正在使用启用分页的 UIScrollView (UIScrollView_1) 以在 3 个页面之间水平移动。
在最后一页上有多个 UIScrollViews(每个在它自己的单元格中)(UIScrollView_2),当水平向右(向前)滚动时显示最后一页(加载相应地滚动到哪个单元格)。
但是如果向左(向后)滚动,我希望 UIScrollView_1 接管并向后滚动。
如果我向上移动手指并注册一个新的触摸事件,这将按预期工作。但我希望它在同一个面板上的两个 UIScrollView 之间同时运行。
|-------------UIScrollView_1----------|
| Page_1 | Page_2 |--UIScrollView_2---|
..................|...Page_3|Page_4...|
我想要的是利用 UIGestureRecognizerDelegate 中的 shouldRecognizeSimultaneouslyWith。
但是,当我尝试将两个 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
}
这是导致 'UIScrollView 的内置平移手势识别器必须将其滚动视图作为其委托的 cellForRow。'-error
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
}
我想你想使用类似
的东西func gestureRecognizer(UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer:UIGestureRecognizer) -> Bool {
if page3 {
return true
}
}
在 ScrollView_2 的 UIViewController 上,将 ScrollView_2 的(不是手势的)委托作为 ViewController、
ScrollView_2.delegate = self
UIPanGesture.delegate = ScrollView_2
我解决了。
UIScrollView
's built-in UIPanGestureRecognizer
must be delegated to its own UIScrollView
as the error 'UIScrollView's built-in pan gesture recognizer must have它的滚动视图作为它的委托。' 说。
相反,子类化 UIScrollView
并创建第二个 UIPanGestureRecognizer
,然后它与内置的 UIPanGestureRecognizer
.
第 1 - 4 步:
子类单元格的
UIScrollView
并创建第二个UIPanGestureRecognizer
.将
同时作用UIGestureRecognizerDelegate
添加到CellScrollView
并使shouldRecognizeSimultaneouslyWith
returntrue
.
第二个UIPanGestureRecognizer
现在将与内置的UIPanGestureRecognizer
.
class 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 return 为真。
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}