我有一个看似多余的按钮。我想删除按钮并将其功能(将带有相关标签的简单条形图设置动画)放入一个从用户输入视图控制器返回时调用的方法。
重命名现有的IBAction方法并将对替换方法的调用放入委托方法来处理转换回原始View控制器似乎很简单。然而,这产生了意想不到的结果。
这是一个截图。有问题的按钮是红色的(显示图表):
问题在于,在更改之前,条形图上的两个标签(firstLabel
和secondLabel
)会在条形图中显示为。方法更改后(创建代码未更改),标签会在返回VC后立即显示,之前条形图为动画。
这是附在按钮上的原始IBAction方法:
- (IBAction)goButtonAction:(id)sender
{
switch (goButtonKey)
{
case 0:
{
}
break;
case 1:
{
[self handleAvsAAction];
[self doTheMathAvsA];
[self makeBarChart];
}
break;
case 2:
{
[self handleCvsCAction];
[self doTheMathCvsC];
[self makeBarChart];
}
default:
break;
}
[self.goButton setUserInteractionEnabled:NO];
}
以下是新方法:
- (void) showGraph
{
switch (goButtonKey)
{
case 0:
{
}
break;
case 1:
{
[self handleAvsAAction];
[self doTheMathAvsA];
[self makeBarChart];
}
break;
case 2:
{
[self handleCvsCAction];
[self doTheMathCvsC];
[self makeBarChart];
}
default:
break;
}
[self.goButton setUserInteractionEnabled:NO];
}
这里是生成条形动画和标签的代码(来自makeBarChart
)。为了简洁起见,我只是展示了一个栏 - 另一个是完全相同的,除了由不同的数据驱动:
switch (thisRiser.tag)
{
case 1:
{
[self.chartView addSubview:firstLabel];
[firstLabel setHidden:YES];
[UIView animateWithDuration:.6
delay:.2
options: UIViewAnimationCurveEaseOut
animations:^
{
// Starting state
thisRiser.frame = CGRectMake(35, self.chartView.frame.size.height, barWidth, 0);
thisRiser.backgroundColor = startColor1;
// End state
thisRiser.frame = CGRectMake(35, self.chartView.frame.size.height, barWidth, -focusBarEndHeight);
thisRiser.backgroundColor = endColor1;
thisRiser.layer.shadowColor = [[UIColor blackColor] CGColor];
thisRiser.layer.shadowOpacity = 0.7;
thisRiser.layer.shadowRadius = 4.0;
thisRiser.layer.shadowOffset = CGSizeMake(5.0f, 5.0f);
thisRiser.layer.shadowPath = [UIBezierPath bezierPathWithRect:thisRiser.bounds].CGPath;
}
completion:^(BOOL finished)
{
firstLabel.frame = CGRectMake(thisRiser.frame.origin.x, thisRiser.frame.origin.y - 65, barWidth, 60);
[firstLabel.titleLabel setFont:[UIFont boldSystemFontOfSize:12]];
firstLabel.titleLabel.numberOfLines = 0;
firstLabel.titleLabel.textAlignment = NSTextAlignmentCenter;
[firstLabel setTitle:[NSString stringWithFormat:@"%@\n%.2f%%\nTime--%@",focusItemName,focusItemPercent,actualDurationFocusItem] forState:UIControlStateNormal];
firstLabel.backgroundColor = [UIColor clearColor];
[firstLabel setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[firstLabel setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
[firstLabel setHidden:NO];
[firstLabel addTarget:self action:@selector(firstLabelAction:) forControlEvents:UIControlEventTouchUpInside];
[firstLabel setUserInteractionEnabled:YES];
[thisRiser setUserInteractionEnabled:YES];
// NSLog(@"Done!");
}];
}
break;
这种直接的改变会导致这种影响,这似乎是不合理的。我已经多次尝试过,以确保我没有破坏任何东西,似乎我不是。
有什么想法吗?
答案 0 :(得分:0)
尝试将来自“completion:^(BOOL finished)”块的所有代码放在if语句中:
completion:^(BOOL finished) {
if (finished) {
// Do all that stuff, including make the label visible...
}
}
答案 1 :(得分:0)
通过将@ {1}}中的前一个按钮操作方法(重构为showGraph)中的代码调用移动到`viewDidAppear中来解决问题,正如@rdelmar在评论中所建议的那样。非常感谢!