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