【发布时间】:2014-02-28 12:44:36
【问题描述】:
我有两个视图控制器。视图控制器 A 有一个 UIScrollView 并呈现视图控制器 B。演示是交互式的,由 scrollView.contentOffset 控制。
我想集成一个交互式关闭过渡:向上平移时,应该以交互方式关闭 ViewController B。交互式关闭过渡还应该控制 ViewController A scrollView。
我的第一次尝试是使用UIPanGestureRecognizer 并根据平移距离设置scrollView.contentOffset。这可行,但是当平移手势结束时,滚动视图偏移必须动画到结束位置。使用-[UIScrollView setContentOffset:animated: 不是一个好的解决方案,因为它使用线性动画,没有考虑当前的平移速度,也不能很好地减速。
所以我认为应该可以将我的平移手势识别器中的触摸事件输入到滚动视图中。这应该给我们所有漂亮的滚动视图动画行为。
我尝试在我的UIPanGestureRecognizer 子类中覆盖-touchesBegan/Moved/Ended/Cancelled withEvent: 方法,如下所示:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[scrollView touchesBegan:touches withEvent:event];
[scrollView.panGestureRecognizer touchesBegan:touches withEvent:event];
[super touchesBegan:touches withEvent:event];
}
但显然有些东西阻止了滚动视图进入tracking 模式。 (它确实去了dragging = YES,但仅此而已。)我验证了滚动视图是userInteractionEnabled,没有隐藏并添加到视图层次结构中。
那么如何将我的触摸事件转发到UIScrollView?
【问题讨论】:
-
一个解决方法建议,也许您可以手动更新
contentOffset,而无需从您的平移手势中获得动画? -
这就是我在过渡的交互部分所做的。但是,当我轻弹 VC B 视图时,我必须以非交互方式继续动画。
-
如果我理解得很好,你在 A 的滚动视图中有一个 viewController B 吗?你的 viewController B 是由 UIPanGesture 操纵的吗?所以如果你上去,它会让viewController B消失,同时滚动A?
-
@AncAinu,不,两个视图控制器都是独立的,VC B 以模态方式呈现在 A 上。平移时,VC B 以交互方式关闭。当平移手势识别器触发时,
dismissViewControllerAnimated:completion:被调用,-startInteractiveTransition:将 VC A 滚动视图添加回容器。从这一点开始,我想将触摸事件转发到滚动视图。
标签: ios iphone cocoa-touch uiscrollview uigesturerecognizer