gpt4 book ai didi

ios - 带有触摸拦截器的 UIScrollView 用于 contentSize 以控制 subview

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:19:20 25 4
gpt4 key购买 nike

假设我有以下 View 层次结构;

enter image description here

那些 View 实际上是 ShinobiCharts,它们是 UIView 的子类。 View1 充当用户可以触摸(捏合、平移、长按等)的主图表。该 View 反过来控制其他 View (View2、View3 等)关于特定的、触摸相关的属性(用户平移 View1,因此 View 2 和 3... 必须相应地进行操作并平移)。但是,一旦用户滚动 UIScrollView,View1 可能会从屏幕上消失,只留下 View 2、3 等可见,它们没有相应的手势识别器,因此用户无法再与图表进行交互,糟糕用户体验。我当然也可以将识别器添加到这些额外的图表中,但是在捏合期间,这意味着两个手指都必须位于一个 View 中,用户不能再次触摸他想要的地方以进行捏合和缩放, 糟糕的用户体验。

简而言之,我需要某种覆盖 UIScrollView 整个内容区域的触摸拦截器,这样当用户捏合或平移时,相应的触摸将被转发到主图表 (View1),而主图表又可以更新其他 subview 。应该始终可以垂直滚动 UIScrollView。

第一个实验:

我尝试将透明的 UIView 添加到覆盖 UIScrollView 的 ViewController。但是,即使直接引用 View1,触摸也不会被转发。

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.chartReference touchesBegan:touches withEvent:event];
}

无论如何,我不太确定这是否是实现此目标的正确方法。

第二个实验:

在 UIScrollView 的图表 subview 上禁用 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 已解决。我没有为平移/捏合手势设置正确的代表。哦!

剩下的就是如何转发捏/平移手势。

最佳答案

您即将在其他 View 之上放置一个透明 View 。但是,您需要重写另一种方法。

您想在透明 View 上覆盖 hitTest:withEvent。在遍历响应链以查看哪个 View 处理特定区域中的触摸时使用此方法。如果 View 处理了该触摸,它会返回 Itself。如果它想将它传递给它下面的下一个 View ,它返回 nil。如果它知道另一个 View 处理该触摸,它可以返回该 View 。

因此,在您的情况下,如果该点位于顶部透明 View 的目标区域中,则返回 view1。然后应调用 View1 的手势识别器。

示例:

InterceptorView 是一个位于 scrollView 之上的透明 View 。 TargetView 是 scrollView 内部的一个 View ,并附加了一个 TapGestureRecognizer。

class InterceptorView: UIView {

required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}

@IBOutlet weak var targetView1: UIView?

override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? {
print("[Interceptor] Testing point: \(point) ")
if self.pointInside(point, withEvent: event) {
println("Hit")
return targetView1
}
else {
println()
return nil;
}
}
}

--

class TargetView: UIView {

required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}

@IBAction func handleGesture(gestureRecognizer: UIGestureRecognizer) {
let location = gestureRecognizer.locationInView(self)
print("[TargetView] Got gesture. Location \(location) ")
if (pointInside(location, withEvent: nil)) {
println("Inside");
}
else {
println("Outside");
}
}
}

这是项目: https://github.com/annabd351/GestureForwarding

(里面还有一些其他的东西,但它有效!)

关于ios - 带有触摸拦截器的 UIScrollView 用于 contentSize 以控制 subview ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27060966/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com