作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将 UITapGestureRecognizer 添加到 UILabel,如果用户有新通知,它将从状态栏向下动画。我希望用户能够单击标签并直接转到公告。 UITapGetureRecognizer 不工作。这是我正在做的:
+(void)animateDown:(NSString *)title view:(UIViewController *)view color:(UIColor *)color time:(NSTimeInterval)duration
{
view = view.navigationController.visibleViewController;
if (currentlyDisplayed == NO) {
if (color == nil) color = customGreen;
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0 ,-40, 320, 40)];
label.text = title;
label.font = [UIFont fontWithName:@"STHeitiTC-Medium" size:18];
label.backgroundColor = color;//customBlue;//[UIColor colorWithRed:0.0993145 green:0.0957361 blue:0.562879 alpha:.8f];
label.layer.cornerRadius = 15.0f;
[label setTextAlignment:NSTextAlignmentCenter];
[label setMinimumFontSize:12];
[label setAdjustsFontSizeToFitWidth:YES];
[label sizeToFit];
label.textColor = [UIColor whiteColor];
if ([color isEqual:customBlue]) {
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onTap:)];
tap.numberOfTapsRequired = 1;
tap.numberOfTouchesRequired = 1;
label.userInteractionEnabled = YES;
[label addGestureRecognizer:tap];
}
[view.view addSubview:label];
[view.view bringSubviewToFront:label];
currentlyDisplayed = YES;
[UIView animateWithDuration:.5f delay:0 options:UIViewAnimationOptionAllowUserInteraction|UIViewAnimationOptionCurveEaseIn animations:^{
label.frame = CGRectMake(0, 0, 320, 40);
}completion:^(BOOL finished) {
CGFloat dur;
if (duration == 0) {
dur = .5f;
}else {
dur = duration;
}
[UIView animateWithDuration:1 delay:dur options:UIViewAnimationOptionAllowUserInteraction|UIViewAnimationOptionCurveEaseOut animations:^{
label.frame = CGRectMake(0,-40,320,40);
}completion:^(BOOL finished) {
if (finished) [label removeFromSuperview];
currentlyDisplayed = NO;
}];
}];
}else {
NSMethodSignature *sig = [[self class] methodSignatureForSelector:@selector(animateDown:view:color:time:)];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:sig];
[invocation setSelector:@selector(animateDown:view:color:time:)];
[invocation setTarget:self];
[invocation setArgument:&title atIndex:2];
[invocation setArgument:&view atIndex:3];
[invocation setArgument:&color atIndex:4];
[invocation setArgument:&duration atIndex:5];
[NSTimer scheduledTimerWithTimeInterval:0.5 invocation:invocation repeats:NO];
}
}
- (IBAction)onTap:(UIPanGestureRecognizer *)recognizer {
[[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:@"announcementTapped" object:nil]];
NSLog(@"tapped");
}
永远不会调用 onTap 方法......它进入 if 语句......参见图片:
最佳答案
它无法识别触摸,因为它在 UIView
动画 block 中被点击。
尝试在设置动画时将 UIViewAnimationOptionAllowUserInteraction
添加到选项参数。
问题是 UIView
层的实际位置在最终目的地。你要做的是检查它的 presentationLayer
是否在被点击的位置。
要解决这个问题,您可以将手势添加到主视图而不是实际标签,并在点击时检查触摸位置是否在标签的 presentationLayer
内:
- (IBAction)onTap:(UITapGestureRecognizer *)tapGestureRecognizer {
CGPoint point = [tapGestureRecognizer locationInView:tapGestureRecognizer.view];
BOOL labelTapped = [self.label.layer.presentationLayer hitTest:point] != nil;
if (labelTapped) {
// do something
}
}
关于objective-c - UITapGestureRecognizer 不适用于 UILabel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13883823/
我是一名优秀的程序员,十分优秀!