更新UILabel时UIImageView消失

时间:2012-07-03 06:43:55

标签: ios xcode uiimageview uibutton uilabel

我有一系列UIButtons用于更新几个UILabel,并从屏幕外到屏幕启动对象的动画。进展是这样的。按钮1& 2是可见的,当用户按下按钮时,UILabel更新并且新的UIImageView动画到屏幕上。这在第一次迭代时工作正常,在第二轮,隐藏的按钮3和4变得可见。一旦用户选择了按钮3或4,另一个UIImageView应该在屏幕上显示动画(在其他图像的顶部......“堆叠”它们)。正在发生的是UIImageView,它在用户按下按钮1或2后动画显示,消失,没有任何动画。只有在UILabels必须根据按钮选择进行更新时才会出现这种情况。在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显然会重置到他们的起始位置......我只是不确定如何防止它。

3 个答案:

答案 0 :(得分:0)

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

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

试一试,看看是否有帮助。

答案 1 :(得分:0)

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

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

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

要诊断第三种可能性,您可以确保在动画之前将图像移动到前面(在为coaster 3设置动画之前,执行[self.view bringSubviewToFront:coasterThree];)。您还可以确保所有控件的backgroundColor(如果您在IB中添加了任何容器UIViews,它们也是透明的)[UIColor clearColor]。你也可以,仅为了诊断目的,暂时减少alpha,这样你就可以看到它们(因此如果有什么东西阻挡了其他东西(你可以在IB中这样做,点击主UIView背景,按命令 + A 选择所有控件,并将alpha更改为0.5。

最重要的是,我会选择选项3,如果您没有运气,请分享您的项目或分享全面的代码示例。如果你觉得这样做不舒服,我可能会建议你扔掉旧的NIB并从头开始重建(如果你得到的东西有些奇怪),或者开始构建一个全新的测试项目重新实现你的UI,看看你是否能找出它出错的地方。

但是UIImageViews动画和设置UILabel文本值没有任何不一致。在下面我有两个按钮的代码,两个动画打开和关闭的图像,以及一个更新的标签,一切正常。 (我有一种信心危机:我开始害怕与UILabels和动画有一些奇怪的互动。)叹气。

- (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;
                     }];
}

答案 2 :(得分:0)

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

对于iOS 6,你要么必须为你的UIView编写一些状态保存 - 或者 - 如果你还没有成长为爱他们并认为你不能没有他们的生活 - 摆脱通过取消选中文件检查器中的“使用Autolayout”来修复xib文件中的约束。

希望这有帮助!