1

UILabelUIView. 我将它用作状态面板,如果不需要显示任何内容,它就会滑出视图。我通过简单地将其动画到 origin.y 减去标签的高度来做到这一点。

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

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

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

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

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

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

更新

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

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

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

更新 2

我更进一步。

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

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

这解决了问题的一半,但在另一侧创建了一个新问题。现在手势识别器工作了,延迟的移出动画不再被触发。

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

编码

// 添加手势识别器(在 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) {}];
}

谢谢和问候,托马斯

4

1 回答 1

1

我终于解决了!

似乎延迟的移出动画以某种方式阻止了标签接收任何触摸事件。甚至 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) {}];
}
于 2012-06-07T18:49:12.150 回答