6

hardWayLabel在 UIView 中有一个 UILabel, hardWayView。我需要这个视图(以及标签)来动画到屏幕最左侧的一个新位置。然而,当标签移动到正确的位置时,可以看到视图继续远离屏幕左侧。我将以下代码用于动画(我在我的应用程序中成功使用了很多次):

        CGRect frame = hardWayView.frame;
        frame.origin.x = painPoint.x;
        frame.origin.y = painPoint.y;
        hardWayView.frame = frame;
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:.25];

我已经使用 NSLog 来确保 painPoint.x 和 painPoint.y 是它们应该是 9,这可以通过 UILabel 最终处于正确位置的事实得到证实。我想真正的问题是为什么 UIView 会继续越过屏幕边界(只有在这种情况下 UIView 从屏幕中心向左移动时才会这样做)?

我确实启用了自动布局,但我不认为这是罪魁祸首。当我在带有 iOS 7 的 iPhone 模拟器上运行应用程序时会出现此问题,并且我无法让模拟器在 iOS 6 上运行,因此无法将问题隔离到 iOS 7(虽然可能吗?我开始在旧版本的 Xcode 并且该应用程序不使用情节提要)。

这是该问题的屏幕录像。如您所见,将两个视图从左向右移动正常工作。尽管将视图移回左侧时,其中一个视图(黑色背景)似乎从左上角离开屏幕,而标签(橙色文本)则转到正确的位置)。解说视频

更新:这里有更多代码。它与我的应用程序中完美运行的其他部分几乎相同,这有点像大脑冲击波。

NSString *stringOfRands = tDict[@"originalRand"];
if ([stringOfRands rangeOfString:@"+"].location != NSNotFound)
{
     NSArray *arrayOfRands = [stringOfRands componentsSeparatedByString:@" + "];

     for (int z=1; z<[arrayOfRands count]; z++)
     {
          NSString *updateValue = arrayOfRands[z];
          NSInteger newHiddenPosition = [self findBlank:leftSpaces];

          NSDictionary *updateStuff = @{@"updateValue": updateValue, @"workingMasterDict":tDict, @"newPos":@(newHiddenPosition), @"newCGPto":@"left", @"@parent":colorV};

          [self revealHidden:updateStuff];

      } 
}

我相信问题确实发生在revealHidden调用动画的方法期间。

[leftSpaces replaceObjectAtIndex:[hardWayPos intValue] withObject:[NSString stringWithFormat:@"full"]];
CGPoint painPoint = [[leftPoints objectAtIndex:[hardWayPos intValue]] CGPointValue];    
[UIView animateWithDuration:0.25 animations:^{
        CGRect frame = hardWayView.frame;
        frame.origin.x = painPoint.x;
        frame.origin.y = painPoint.y;
        hardWayView.frame = frame;
    } completion:^(BOOL finished) {
        //
    }];

hardWayView.hidden=0;
hardWayView.backgroundColor = [UIColor blueColor];
hardWayLabel.textColor = [UIColor orangeColor];

我已经尝试制作frame.origin.x.y实际数字(相对于变量),并且出现了相同的模式:UILabel 动画到正确的位置,UIView 从屏幕的左上角开始动画

4

3 回答 3

10

哇哦!经过muuuch调试,我终于找到了问题!:) 让我告诉你......你有一些有趣的代码。无论如何,您会惊讶地发现这个问题有多愚蠢;你准备好了吗?

这是问题所在:

在第 540 行附近,您有一个额外的“@”符号,这就是为什么当您尝试检索它找不到它的值时:

//ERROR HERE
NSArray *arrayOfRands = [stringOfRands componentsSeparatedByString:@" + "];

for (int z=1; z<[arrayOfRands count]; z++)
{
    NSString *updateValue = arrayOfRands[z];
    NSInteger newHiddenPosition = [self findBlank:leftSpaces];

    // This is the line with the error!!
    // You have @"@parent" but it should be @"parent"      
    NSDictionary *updateStuff = @{@"updateValue": updateValue, @"workingMasterDict":tDict, @"newPos":@(newHiddenPosition), @"newCGPto":@"left", @"@parent":colorV};

    [self revealHidden:updateStuff];

}

调试您的代码非常有趣!

干杯:)

于 2013-10-23T18:41:43.997 回答
6

从外观上看,您是hardWayView.frame = frame;在动画开始之前设置的,因此 UIView 将更改位置然后进行动画处理。换地方

hardWayView.frame = frame;
[UIView beginAnimations:nil context:nil];

应该修复它。

无论如何,我强烈建议转移到动画块。上面的代码应该是这样的:

[UIView animateWithDuration:0.4 animations:^{
CGRect frame = hardWayView.frame;
frame.origin.x = painPoint.x;
frame.origin.y = painPoint.y;
hardWayView.frame = frame;
} completion:^(BOOL finished) {
    //
}];
于 2013-10-22T17:53:29.923 回答
1

在完成块中包含代码不是更好吗?(或在 animateWithDuration 块之前)。

[UIView animateWithDuration:0.25 animations:^{
                CGRect frame = hardWayView.frame;
                frame.origin.x = painPoint.x;
                frame.origin.y = painPoint.y;
                hardWayView.frame = frame;
            } completion:^(BOOL finished) {

            hardWayView.hidden=0;
            hardWayView.backgroundColor = [UIColor blueColor];
            hardWayLabel.textColor = [UIColor orangeColor];

            NSDictionary *hardWay = @{@"view": hardWayView, @"label": hardWayLabel, @"intValue":[NSString stringWithFormat: @"%@", hardWayLabel.text], @"hiddenBool":@0, @"position":@([hardWayPos intValue]), @"originalRand": [NSString stringWithFormat: @"%@", hardWayLabel.text]};
            [masterDict replaceObjectAtIndex:[masterDict indexOfObject:miniMaser] withObject:hardWay];

            }];

此外,如果是我,我也会为每个矩形使用不同的名称来帮助调试。例如,不要总是称你的矩形为“框架”。称它为centerFrame、leftFrame、rightFrame。

当您在动画结束时注销 hardWayView 的帧时,它会报告您的期望吗?

当您在动画开始时注销 hardWayView 的帧时,它会报告您的期望吗?

我的猜测是 hardWayView 的框架不是你想象的那样。

如果您直接设置框架而不对其进行动画处理,它是否可以按预期工作?

于 2013-10-23T16:06:08.137 回答