gpt4 book ai didi

iphone - UITapGestureRecognizer 在移出 View 并返回后被忽略

转载 作者:行者123 更新时间:2023-11-29 13:34:32 25 4
gpt4 key购买 nike

我的 UIView 中有一个 UILabel 作为 child 。我将它用作状态面板,如果不需要显示任何内容,它会滑出 View 。我通过简单地将它设置为 origin.y 减去标签的高度来实现这一点。

一旦必须显示一条消息,我就将标签滑回 View 中。延迟几秒钟后,它会滑出。这很好用。

我还在标签中添加了一个 UITapGestureRecognizer,因此用户可以立即关闭该消息,而无需等待它自动消失。

我的问题是,一旦标签移出 View ,手势识别器就不会触发。当标签完全在 View 内并且可见时,我初始化并添加手势识别器。它第一次按预期工作。但是当消息返回时,手势识别器似乎已被删除或禁用。

我还尝试在动画的完整 block 中每次标签完全显示在屏幕上时添加一个 gr,但这也无济于事。

有人可以向我解释这里发生了什么以及我如何让识别器一直工作吗?

如果您需要更多信息,请告诉我。

更新

我做了一些进一步的测试,当我在 showError 调用中记录 lblError.gestureRecognizers 时,我得到了这个:

<UITapGestureRecognizer: 0x6b153f0; state = Possible; view = <UILabel 0x6b14fa0>; target= <(action=dismissError:, target=<OptionViewController 0x686d2a0>)>>

它与创建后得到的完全一样。所以它仍然存在,我猜触摸事件没有到达它。

更新 2

我更进一步。

问题似乎是我将标签移动到 y 坐标 0。这可能是 GestureRecognizer 代码中的错误,因为当我将它设置为 0.1 时它起作用了!

看起来系统“认为”标签不在 View 中,因此禁用了触摸处理或其他东西。 ^^

这解决了一半的问题,但在另一侧产生了新的问题。现在手势识别器可以工作了,延迟的移出动画就不会再被触发了。

所以我认为真正的问题是,移出动画是在移入之后立即触发的。即使它被延迟,它也会阻止标签接收任何类型的触摸事件。

代码

//添加手势识别器(在 viewDidLoad 中)

UITapGestureRecognizer *errorDismissGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissError:)];
[lblError addGestureRecognizer:errorDismissGesture];

// display error
- (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;
lblError.frame = frame;
}
completion:^(BOOL finished) {
[UIView animateWithDuration:0.5
delay:2.0
options:UIViewAnimationOptionCurveEaseOut
animations:^(void) {
CGRect frame = lblError.frame;
frame.origin.y = -40.0f;
lblError.frame = frame;
}
completion:^(BOOL finished) {}];
}];
}

- (void)dismissError:(UIGestureRecognizer *)sender {
[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) {}];
}

关于iphone - UITapGestureRecognizer 在移出 View 并返回后被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10937382/

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