我有一个手势后出现的标签,我想淡出标签。以下代码可以正常工作,但是如果我连续做几个手势,最后一个不完成淡入淡出和显示,但然后突然停止。这是我的代码:
- (void) gestureLabelAppear:(NSString *)theLabelText
{
myLabel = [[UILabel alloc] initWithFrame:CGRectMake(gestureEndPoint.x, gestureEndPoint.y, 200, 20)];
myLabel.center=CGPointMake(gestureEndPoint.x, gestureEndPoint.y);
myLabel.textAlignment = UITextAlignmentCenter;
myLabel.text =theLabelText;
[self.view addSubview:myLabel];
[self fadeOutLabels];
}
-(void)fadeOutLabels
{
[UIView animateWithDuration:3.0
delay:0.0
options:UIViewAnimationCurveEaseInOut
animations:^ {
myLabel.alpha = 0.0;
}
completion:^(BOOL finished) {
[myLabel removeFromSuperview];
NSLog(@"removed label");
}];
}
有关如何修复的任何建议?
答案 0 :(得分:0)
问题可能在于您要求处理器连续执行太多动画和/或动画被事件循环中的其他进程中断。我经常发现这样的计时问题可以通过插入延迟来解决。
尝试将[self fadeOutLabels];
替换为[self performSelector:@selector(fadeOutLabels) withObject:nil afterDelay:(NSTimeInterval)0.1];
和/或用[self.view addSubview:myLabel];
[self.view performSelector:@selector(addSubview:) withObject:myLabel afterDelay:(NSTimeInterval)0.1];
(我并不是说我理解所有的内部运作,只是说这个kludge在过去对我有用同样的问题。)
答案 1 :(得分:0)
您通过省略removeFromSuperview
方法中的fadeOutLabels
解决了主要问题,但现在这些标签会累积,占用内存。而且你通过在没有提供释放的情况下进行分配来开始泄漏。
我认为这两项改变可能会完善您已经达成的解决方案:
1)为UILabel创建一个名为“myLabel。”的属性。
2)将gestureLabelAppear
和fadeOutLabels
更改为:
- (void) gestureLabelAppear:(NSString *)theLabelText
{
if (self.myLabel) {
[self.myLabel removeFromSuperview];
self.myLabel = nil;
}
self.myLabel = [[[UILabel alloc] initWithFrame:CGRectMake(gestureEndPoint.x, gestureEndPoint.y, 200, 20)] autorelease];
self.myLabel.center=CGPointMake(gestureEndPoint.x, gestureEndPoint.y);
self.myLabel.textAlignment = UITextAlignmentCenter;
self.myLabel.text =theLabelText;
[self.view addSubview:self.myLabel];
[self fadeOutLabels];
}
-(void)fadeOutLabels
{
[UIView animateWithDuration:3.0
delay:0.0
options:UIViewAnimationCurveEaseInOut
animations:^ {
myLabel.alpha = 0.0;
}
completion:NULL];
}
答案 2 :(得分:0)
这是似乎有用的代码。我需要在标签上添加标签,以便明确引用我正在创建的各个标签。我通过将alpha值更改为.2并观察它们消失来验证标签消失。
- (void) gestureLabelAppear:(NSString *)theLabelText
{
counter=counter+1;
self.myLabel = [[UILabel alloc] initWithFrame:CGRectMake(gestureEndPoint.x, gestureEndPoint.y, 200, 20)];
self.myLabel.center=CGPointMake(gestureEndPoint.x, gestureEndPoint.y);
self.myLabel.textAlignment = UITextAlignmentCenter;
self.myLabel.text =[NSString stringWithFormat:@"%@-%d",theLabelText,counter];
self.myLabel.tag=counter;
[self.view addSubview:self.myLabel];
[self fadeOutLabels:counter];
}
-(void)fadeOutLabels:(int)theTag
{
[UIView animateWithDuration:3.0
delay:0.0
options:UIViewAnimationCurveEaseInOut
animations:^ {
self.myLabel.alpha = 0.2;
}
completion:^(BOOL finished) {
UILabel *label = (UILabel *)[self.view viewWithTag:theTag];
[[self.view viewWithTag:theTag] removeFromSuperview];
label=nil;
}];
}