Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 不应该';触摸子视图时,UI识别器是否会触发?_Ios_Cocoa Touch_Uigesturerecognizer_Subview - Fatal编程技术网

Ios 不应该';触摸子视图时,UI识别器是否会触发?

Ios 不应该';触摸子视图时,UI识别器是否会触发?,ios,cocoa-touch,uigesturerecognizer,subview,Ios,Cocoa Touch,Uigesturerecognizer,Subview,我的iPad应用程序中的视图的行为就好像它们阻止了superview的手势识别器在用户在该视图中启动该手势时启动一样 这是预期的吗? 如何消除这种屏蔽行为? 调试手势识别器的良好实践是什么 详情如下: 我的应用程序的主“画布”视图允许用户通过“长双击”向其添加形状。我在主视图中附加了一个手势识别器来识别这些手势。这非常有效:主视图被调用,并通过向主视图添加形状进行响应 形状作为主视图的子视图实现。当用户在主视图中长双击时,我的代码实例化一个shape子视图,并将其添加到主视图中。形状视图可以使用

我的iPad应用程序中的视图的行为就好像它们阻止了superview的手势识别器在用户在该视图中启动该手势时启动一样

这是预期的吗? 如何消除这种屏蔽行为? 调试手势识别器的良好实践是什么

详情如下:

我的应用程序的主“画布”视图允许用户通过“长双击”向其添加形状。我在主视图中附加了一个手势识别器来识别这些手势。这非常有效:主视图被调用,并通过向主视图添加形状进行响应

形状作为主视图的子视图实现。当用户在主视图中长双击时,我的代码实例化一个shape子视图,并将其添加到主视图中。形状视图可以使用长的单点击识别器进行移动。因此,我还附加了一个手势识别器,用于对每个形状视图进行长时间的单次点击。这非常有效:调用shape视图,让用户在画布中移动它

但是,当用户在形状视图中长时间双击时,什么也不会发生:形状视图不会被调用,这是预期的,因为它没有长时间双击的手势识别器。但主视图也不被称为。我曾认为,由于该手势未被形状视图识别,因此它将在响应器链中向上传播到主视图。但这并没有发生

我的目的是让用户向主视图添加重叠的形状,这样长时间双击形状也会向主视图添加新的形状

我会错过什么

当然,我可以添加一个长的双击识别器来塑造视图,然后,或者将手势转发到主视图,或者以类似于我在主视图中所做的方式直接处理手势

但这听起来很浪费,更重要的是,我想了解这种行为


谢谢你的建议。

就我所能看到的而言,它应该是开箱即用的

要确保两个
手势识别器都未被触发,您需要执行以下操作:

[longPress requireGestureRecognizerToFail:doubleLongPress];
//.h
@interface MyController : UIViewController <UIGestureRecognizerDelegate>
// ...
@end

//.m
@implementation MyController

//...

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;
{
    BOOL shouldReceiveTouch = YES;

    if (gestureRecognizer == self.myGesture) {
        shouldReceiveTouch = (touch.view == self.view);
    }

    return shouldReceiveTouch;
}

//...

@end
更新

只需在此处自由设置样式,但如果您想将手势限制为一个视图,您可以尝试使用手势代理(仅当触摸的视图为
self.view
时才会响应)

在控制器中执行以下操作:

[longPress requireGestureRecognizerToFail:doubleLongPress];
//.h
@interface MyController : UIViewController <UIGestureRecognizerDelegate>
// ...
@end

//.m
@implementation MyController

//...

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;
{
    BOOL shouldReceiveTouch = YES;

    if (gestureRecognizer == self.myGesture) {
        shouldReceiveTouch = (touch.view == self.view);
    }

    return shouldReceiveTouch;
}

//...

@end
/.h
@接口MyController:UIViewController
// ...
@结束
//m
@MyController的实现
//...
-(BOOL)手势识别器:(UIGestureRecognitor*)手势识别器应接受触摸:(UITouch*)触摸;
{
BOOL shouldReceiveTouch=是;
if(手势识别器==self.my手势){
shouldReceiveTouch=(touch.view==self.view);
}
返回时应接受触摸;
}
//...
@结束

NB我还没有测试过这个,但稍后测试时会更新它。

就我所能看到的而言,它应该是开箱即用的

要确保两个
手势识别器都未被触发,您需要执行以下操作:

[longPress requireGestureRecognizerToFail:doubleLongPress];
//.h
@interface MyController : UIViewController <UIGestureRecognizerDelegate>
// ...
@end

//.m
@implementation MyController

//...

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;
{
    BOOL shouldReceiveTouch = YES;

    if (gestureRecognizer == self.myGesture) {
        shouldReceiveTouch = (touch.view == self.view);
    }

    return shouldReceiveTouch;
}

//...

@end
更新

只需在此处自由设置样式,但如果您想将手势限制为一个视图,您可以尝试使用手势代理(仅当触摸的视图为
self.view
时才会响应)

在控制器中执行以下操作:

[longPress requireGestureRecognizerToFail:doubleLongPress];
//.h
@interface MyController : UIViewController <UIGestureRecognizerDelegate>
// ...
@end

//.m
@implementation MyController

//...

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;
{
    BOOL shouldReceiveTouch = YES;

    if (gestureRecognizer == self.myGesture) {
        shouldReceiveTouch = (touch.view == self.view);
    }

    return shouldReceiveTouch;
}

//...

@end
/.h
@接口MyController:UIViewController
// ...
@结束
//m
@MyController的实现
//...
-(BOOL)手势识别器:(UIGestureRecognitor*)手势识别器应接受触摸:(UITouch*)触摸;
{
BOOL shouldReceiveTouch=是;
if(手势识别器==self.my手势){
shouldReceiveTouch=(touch.view==self.view);
}
返回时应接受触摸;
}
//...
@结束

NB我还没有测试过这个,但我会在稍后测试时更新。

当您在子视图上双击长点击时,它是否会触发单长点击?是的,子视图单长点击会触发吗?当您在子视图上双击长点击时,它会触发单长点击吗?是的,子视图单长点击就是这样。我没有配置识别器依赖项。不知何故,我认为其他观点的识别者是独立的,而事实并非如此。使耦合对我来说太强了,但我真的不知道如何避免。是的,就是这样。我没有配置识别器依赖项。不知何故,我认为其他观点的识别者是独立的,而事实并非如此。使耦合对我来说太强了,但我真的看不出如何避免这种情况。