【发布时间】:2015-01-19 13:48:54
【问题描述】:
假设我有以下视图层次结构;
这些视图实际上是 ShinobiCharts,它们是 UIView 的子类。 View1 充当用户可以触摸的主图表(捏合、平移、长按等)。该视图反过来控制其他视图(View2、View3 等)关于特定的、与触摸相关的属性(用户平移 View1,因此视图 2 和 3...必须相应地进行操作并平移)。 但是,一旦用户滚动 UIScrollView,View1 可能会从屏幕上消失,只留下视图 2、3 等可见,它们没有相应的手势识别器,因此用户无法再与图表交互,糟糕用户体验。 我当然也可以将识别器添加到这些额外的图表中,但是在捏合期间,这意味着两个手指都必须位于单个视图中,用户不能再次触摸他想要的位置以进行捏合和缩放,糟糕的用户体验。
为了简短起见,我需要某种触摸拦截器来覆盖 UIScrollView 的整个内容区域,这样当用户捏或平移时,相应的触摸将被转发到主图表(View1),这反过来可以更新其他子视图。 UIScrollView 应该始终可以垂直滚动。
第一个实验:
我尝试向覆盖 UIScrollView 的 ViewController 添加一个透明的 UIView。 但是,即使直接引用 View1,触摸也不会被转发。
-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.chartReference touchesBegan:touches withEvent:event];
}
我不太确定这是否是实现这一目标的正确方法。
第二次实验:
在 UIScrollView 中的图表子视图上禁用 userInteraction 并将我自己的捏合和平移手势(在 UIViewController 中)添加到 UIScrollView。
问题; 1. UIScrollView 不再滚动。 2. 如何将这些手势转发给View1?
恐怕我现在无法提供更多示例代码,因为还没有太多相关的代码可以展示。
编辑: 实验二的小笔记; 手势识别器已添加如下;
UIPinchGestureRecognizer *pinchGestureRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchGesture:)];
pinchGestureRecognizer.cancelsTouchesInView = NO;
[scrollView addGestureRecognizer:pinchGestureRecognizer];
已启用 UIViewController 上的同时手势识别;
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
return YES;
}
编辑:
实验 2 的问题 2 已解决。我没有为平移/捏合手势设置正确的代表。哦!
剩下的就是如何转发捏/平移手势。
【问题讨论】:
-
您是否尝试过
UIScrollView缩放功能。它默认支持缩放,你只需要提供将被缩放的视图,所以我认为你只需要确定屏幕上的视图并将其传递给UIScrollView。 -
在 UIScrollView 中缩放似乎更像是一种简单地缩放 UIScrollView 的子视图的解决方案,从而修改它们的大小。不过,这不是我要找的。尺寸必须保持不变,因为只有我的 UIView 的内容需要更改,而这又由 ShinobiChart 本身处理。
标签: ios objective-c uiview uiscrollview uigesturerecognizer