iOS动画1 + 2 = 3. 3-2!= 1

时间:2012-05-15 23:21:19

标签: ios ios5

iPad - iOS 5.1 - Xcode 4.3.2

当键盘弹出时,我将我的UIImageView的y原点设为“x” 当键盘发生故障时,我会用相同的“x”

将其设置为动画

因此键盘弹出,图像上升X,键盘下降,图像下降x,但它不会在同一个地方结束!你走了60岁,60岁,你不在同一个地方!它进一步向下,好像坐标系在键盘的外观和它的消失之间发生了变化。这绝对让我发疯。我不明白为什么会这样。

//add gesture recognizer when keyboard appears
-(void)keyboardWillShow:(NSNotification *) note {

    [self.view addGestureRecognizer:tapRecognizer];

    // Setup the animation
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3f];
    [UIView setAnimationCurve:UIViewAnimationOptionCurveEaseInOut];
    [UIView setAnimationBeginsFromCurrentState:YES];

    // The transform matrix: Logo Image

    CGAffineTransform moveLogo = CGAffineTransformMakeTranslation(0, -60);
    self.logoImageView.transform = moveLogo;

    // Commit the changes
    [UIView commitAnimations];  
}

//add gesture recognizer when keyboard appears
-(void)keyboardWillHide:(NSNotification *) note {

    [self.view removeGestureRecognizer:tapRecognizer];

    // Setup the animation
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3f];
    [UIView setAnimationCurve:UIViewAnimationOptionCurveEaseInOut];
    [UIView setAnimationBeginsFromCurrentState:YES];

    // The transform matrix: Logo Image

    CGAffineTransform moveLogo = CGAffineTransformMakeTranslation(0, 60);
    self.logoImageView.transform = moveLogo;

    // Commit the changes
    [UIView commitAnimations];  
}

3 个答案:

答案 0 :(得分:4)

那是因为你没有翻译它,当你使用CGAffineTransformMakeTranslation时,你说给我这些坐标而不是给我这个偏移。换句话说,make translation为您提供 identity 矩阵的翻译。你想要的功能是CGAffineTransformTranslate。这将将转换应用于当前转换(作为第一个参数传递)。

答案 1 :(得分:0)

转换属性不是累积的。你没有做你认为自己在做的事情。您正在从您的身份计算新变换,而不是从当前变换计算。

而不是:

   CGAffineTransform moveLogo = CGAffineTransformMakeTranslation(0, 60);
    self.logoImageView.transform = moveLogo;

尝试:

self.logoImageView.transform = CGAffineTransformIdentity;

答案 2 :(得分:-1)

您可能希望为简单的视图属性(如框架或大小)设置动画,而不是使用Core Graphics。例如:

[self.logoImageView.center = CGPointMake(self.logoImageView.center.x,
self.logoImageView.center.y + 60);

beginAnimationscommitAnimations

之间执行此操作