Iphone 将外部视图移回内部后,将忽略UITapgestureRecognitor

Iphone 将外部视图移回内部后,将忽略UITapgestureRecognitor,iphone,objective-c,ios,gesture,uitapgesturerecognizer,Iphone,Objective C,Ios,Gesture,Uitapgesturerecognizer,我在我的ui视图中有一个ui标签作为孩子。我使用它作为状态面板,如果不需要显示任何内容,它将从视图中滑出。我只需将其设置为origin.y减去标签高度即可 一旦需要显示消息,我就将标签滑回视图中。延迟几秒钟后,它滑出。那很好 我还向标签添加了一个uitappesturerecognizer,这样用户就可以立即删除消息,而无需等待消息自动消失 我的问题是,一旦标签移出视图,手势识别器就不会启动。当标签完全位于视图内部且可见时,我初始化并添加手势识别器。它第一次就如预期的那样工作。但是当信息返回时,

我在我的
ui视图中有一个
ui标签
作为孩子。我使用它作为状态面板,如果不需要显示任何内容,它将从视图中滑出。我只需将其设置为origin.y减去标签高度即可

一旦需要显示消息,我就将标签滑回视图中。延迟几秒钟后,它滑出。那很好

我还向标签添加了一个
uitappesturerecognizer
,这样用户就可以立即删除消息,而无需等待消息自动消失

我的问题是,一旦标签移出视图,手势识别器就不会启动。当标签完全位于视图内部且可见时,我初始化并添加手势识别器。它第一次就如预期的那样工作。但是当信息返回时,手势识别器似乎被删除或禁用

我还尝试在每次标签完全出现在动画的完整块中的屏幕上时添加gr,但这也没有帮助

有人能给我解释一下这里发生了什么,以及我如何让识别器一直工作吗

如果你需要更多的信息,请告诉我

更新 我做了一些进一步的测试,当我在淋浴ROR调用中记录lblError.gestureRecogenerators时,我得到了这个结果:

<UITapGestureRecognizer: 0x6b153f0; state = Possible; view = <UILabel 0x6b14fa0>; target= <(action=dismissError:, target=<OptionViewController 0x686d2a0>)>>
感谢并问候, 托马斯,我终于解决了

似乎延迟的移出动画以某种方式阻止标签接收任何触摸事件。即使是UIAnimationOptionAllowUserInteraction也无济于事

因此,我用一个定时调用替换了延迟的动画,这使得代码甚至有点可读性。这就是现在的样子

 - (void)showError:(NSString *)message {
     [lblError setText:message];
     [UIView animateWithDuration:0.5 
                     animations:^(void) { 
                         CGRect frame = lblError.frame;
                         frame.size.width = self.view.bounds.size.width;
                         frame.origin.y = 0.1;
                         lblError.frame = frame;
                     } 
                     completion:^(BOOL finished) {
                         if (finished) {
                            [_moveOutTimer invalidate];
                             _moveOutTimer = nil;
                             _moveOutTimer = [NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(dismissError:) userInfo:nil repeats:NO];
                         }
                     }];
}

- (void)dismissError:(UIGestureRecognizer *)sender {
    [_moveOutTimer invalidate];

    [UIView animateWithDuration:0.3
                    animations:^(void) {
                         CGRect frame = lblError.frame;
                         frame.origin.y = -40.0;
                         lblError.frame = frame;
                     }
                     completion:^(BOOL finished) {}];
}
我终于解决了

似乎延迟的移出动画以某种方式阻止标签接收任何触摸事件。即使是UIAnimationOptionAllowUserInteraction也无济于事

因此,我用一个定时调用替换了延迟的动画,这使得代码甚至有点可读性。这就是现在的样子

 - (void)showError:(NSString *)message {
     [lblError setText:message];
     [UIView animateWithDuration:0.5 
                     animations:^(void) { 
                         CGRect frame = lblError.frame;
                         frame.size.width = self.view.bounds.size.width;
                         frame.origin.y = 0.1;
                         lblError.frame = frame;
                     } 
                     completion:^(BOOL finished) {
                         if (finished) {
                            [_moveOutTimer invalidate];
                             _moveOutTimer = nil;
                             _moveOutTimer = [NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(dismissError:) userInfo:nil repeats:NO];
                         }
                     }];
}

- (void)dismissError:(UIGestureRecognizer *)sender {
    [_moveOutTimer invalidate];

    [UIView animateWithDuration:0.3
                    animations:^(void) {
                         CGRect frame = lblError.frame;
                         frame.origin.y = -40.0;
                         lblError.frame = frame;
                     }
                     completion:^(BOOL finished) {}];
}

您应该只需要添加一次。我们能看看代码吗?我已经添加了代码。希望能有所帮助。您是否无意中将同一识别器分配给其他视图?不。这是我创建并将其添加到标签的唯一位置。您只需添加一次。我们能看看代码吗?我已经添加了代码。希望这能有所帮助。您是否无意中将同一识别器分配到其他位置的另一个视图?不。这是我创建并将其添加到标签的唯一位置。