2

我有一系列 UIButtons 用于更新几个 UILabel 并启动对象从屏幕外到屏幕上的动画。进展是这样的。按钮 1 和 2 是可见的,当用户按下按钮时,UILabel 会更新,并且新的 UIImageView 会在屏幕上显示动画。这在第一次迭代中运行良好,在第二轮中,隐藏的按钮 3 和 4 变得可见。一旦用户选择按钮 3 或 4,另一个 UIImageView 应该动画到屏幕上(在其他图像的顶部......“堆叠”它们)。正在发生的是 UIImageView 在用户按下按钮 1 或 2 后动画,消失,并且没有动画。仅当 UILabel 必须根据按钮选择进行更新时才会发生这种情况。在 UILabel 中不需要更新,动画效果很好。

相关代码:

-(IBAction)didTapSizeButton:(id) sender {

if ([sender tag] == 1) {
    sizeLabel.text = @"12 oz";
}
else if ([sender tag] == 2) {
    sizeLabel.text = @"24 oz";
}

if (coasterTwo.center.x != 150) {

    [UIView animateWithDuration:0.35
                          delay:0
                        options:(UIViewAnimationOptionCurveEaseOut)
                     animations:^{
                         coasterTwo.center = CGPointMake(150, 220);

                     } completion:^(BOOL finished) {


                     }];

}

containerOne.hidden = NO;
containerTwo.hidden = NO;

}

-(IBAction)didTapContainerButton:(id)sender {

if ([sender tag] == 3) {
    containerLabel.text = @"Bottle";
}

else if ([sender tag] == 4) {
    containerLabel.text = @"Can";
}

if (coasterTwo.center.x == 150 && coasterThree.center.x != 150) {

    [UIView animateWithDuration:0.35
                          delay:0
                        options:(UIViewAnimationOptionCurveEaseOut)
                     animations:^{
                         CGPoint center = coasterThree.center;
                         center.x += 305;
                         coasterThree.center = center;

                     }
                     completion:^(BOOL finished){

                     }];

}


}

一旦我返回更新 UILabel,UIImageViews 显然会重置到它们的起始位置......我只是不知道如何防止这种情况。

4

3 回答 3

0

我的一个学生也发生了同样的事情。为了证明你不会发疯...尝试在 iOS 5.x 模拟器中运行它(并希望观察到所需的行为)。

对于 iOS 6,你要么必须为你的 UIView 编写一些状态保存代码——或者——如果你还没有爱上它们并且认为没有它们就活不下去——摆脱在通过在文件检查器中取消选中“使用自动布局”来查看 xib 文件。

希望这可以帮助!

于 2013-04-08T18:03:01.690 回答
0

必须有一些简单的东西。正如我所说,代码didTapContainerButton似乎很可疑(每次你点击它coasterThree都会向右移动 305 个点),但上面没有显示任何内容会导致coasterTwo消失。唯一会这样做的是,如果 (a) 某些 IB 链接被弄乱了(尽管尚不清楚当您按下按钮 3 或 4 时这会如何导致图像消失);(b) 您没有显示的代码可能会隐藏它;或(c)您的窗口上有一些隐藏它的其他控件(我肯定见过更新标签导致它被带到前面的情况,掩盖它后面的东西......你可以通过以下方式诊断它使标签具有透明背景,明确地将图像移动到前景,或者尝试将 alphas 设置为 0.5,以便在调试时可以看穿东西)。

要诊断第一种可能性,您必须将您的项目上传到 DropBox 或其他东西,我们可以看看它(如果您愿意这样做......如果没有,请复制您的项目,摆脱任何机密/专有信息,然后上传)。

要诊断第二种可能性,您可以使用视图控制器的 .m 文件的完整代码更新您的问题。

要诊断这第三种可能性,您可以确保在制作图像动画之前将其向前移动(在制作过山车三动画之前,请执行此操作[self.view bringSubviewToFront:coasterThree];)。您还可以确保backgroundColor所有控件(如果您有任何已在 IB 中添加的容器 UIViews,它们也是)是透明的[UIColor clearColor]。您也可以,仅出于诊断目的,暂时降低 alpha 以便您可以看穿它们(因此,如果有任何东西阻挡了其他东西(您可以在 IB 中执行此操作,单击主 UIView 背景,按command+A选择所有控制,并将 alpha 更改为 0.5)。

底线,我会追求选项 3,如果你没有运气,要么分享你的项目,要么分享一个全面的代码示例。如果你觉得这样做不舒服,我可能会建议你扔掉你的旧 NIB 并从头开始重建它(以防你有什么奇怪的东西)或者开始构建一个全新的测试项目,你可以在其中逐步重新实现你的用户界面,看看你是否能找出哪里出了问题。

但是没有什么与 UIImageViews 动画和设置 UILabel 文本值不一致的地方。下面我有两个按钮的代码,两个动画开和关的图像,以及一个更新的标签,一切都很好。(我有信心危机:我开始担心与 UILabel 和动画有一些奇怪的交互。) 叹息。

- (void)viewDidLoad
{
    [super viewDidLoad];

    CGPoint center;

    self.label.text = @"";

    // move image 1 (dog image) off screen to the left

    center = self.image1.center;
    center.x = -0.5 * self.view.frame.size.width;
    self.image1.center = center;
    self.image1.hidden = YES;

    // move image 2 (cat image) off screen to the right

    center = self.image2.center;
    center.x = 1.5 * self.view.frame.size.width;
    self.image2.center = center;
    self.image2.hidden = YES;

    // Do any additional setup after loading the view.
}

// if you hit button 1 (dog) button, change label, and animate the dog image on and cat image off

- (IBAction)button1:(id)sender 
{
    self.label.text = @"Dog";

    self.image1.hidden = NO;

    [UIView animateWithDuration:0.5 
                     animations:^{
                         CGPoint center;

                         // move image 1 (dog image) onscreen

                         center = self.image1.center;
                         center.x = 0.5 * self.view.frame.size.width;
                         self.image1.center = center;

                         // move image 2 (cat image) off screen to the right (if it's not there already)

                         center = self.image2.center;
                         center.x = 1.5 * self.view.frame.size.width;
                         self.image2.center = center;
                     }];
}

// if you hit button 2 (cat) button, change label, and animate the dog image off and cat image on

- (IBAction)button2:(id)sender 
{
    self.label.text = @"Cat";

    self.image2.hidden = NO;

    [UIView animateWithDuration:0.5 
                     animations:^{
                         CGPoint center;

                         // move image 1 (dog image) off screen to the left

                         center = self.image1.center;
                         center.x = -0.5 * self.view.frame.size.width;
                         self.image1.center = center;

                         // move image 2 (cat image) on screen

                         center = self.image2.center;
                         center.x = 0.5 * self.view.frame.size.width;
                         self.image2.center = center;
                     }];
}
于 2012-07-04T17:25:29.770 回答
0

我建议使用静态 UIView commitAnimations 方法,因为您不需要完成块:

[UIView beginAnimations:nil context:nil];
//Code for changing frames / alpha / anything else that is animatable
[UIView commitAnimations];

试试这个,看看是否有帮助。

于 2012-07-03T07:07:51.040 回答