iOS / Objective-C:transitionWithView自定义动画块立即调整视图大小,而不是持续时间

时间:2011-07-11 18:49:36

标签: objective-c ios uiview size uiviewanimationtransition

以下代码是我在UIViewController中创建的方法,用于在控制器自己的视图之上弹出/关闭“reader”覆盖。目的是让读者在特定点开始透明,大小为零。然后,“Popup”被动画化为不透明度和大小的增加,并且朝向应用帧中心位置移动。 “Popdown”随后被反复动画,在向指定位置移动时缩小,渐渐消失。

弹出代码完全符合要求。但是,popdown版本(即isPopup == NO时执行的代码)会立即更改边界而不是逐渐更改边界。因此,弹出动画从一开始就显示一个1像素的正方形视图朝着目的地移动并逐渐淡出。

-(void)popupReader:(BOOL)isPopup from:(CGPoint)loc  {
    CGFloat newAlpha = 0.0f;
    CGPoint newCenter = CGPointZero;
    CGRect newBounds = CGRectZero;
    CGRect appFrame = [UIScreen mainScreen].applicationFrame;

    CGSize readerSize = [self viewSize];
    if (isPopup) {
        newAlpha = 1.0f;
        newCenter = CGPointMake(appFrame.origin.x+appFrame.size.width/2,
                                appFrame.origin.y+appFrame.size.height/2);
        newBounds = CGRectMake(0,0,readerSize.width,readerSize.height);

        [self.view setAlpha:0.0f];
        [self.view setCenter:loc];
        [self.view setBounds:CGRectMake(0, 0, 0, 0)];
    } else {
        newCenter = loc;
        newBounds = CGRectMake(0,0,1,1);
    }

    const CGFloat animDur = 0.3f;    
    [UIView transitionWithView:self.view 
                      duration:animDur
                       options:UIViewAnimationOptionTransitionNone|UIViewAnimationOptionCurveEaseOut 
                    animations:^{
      self.view.alpha = newAlpha; 
      self.view.center = newCenter; 
      self.view.bounds = newBounds;
      } 
         completion:nil];
}

我已经尝试过动画帧,而不是边界和中心,但结果是相同的。

有谁知道为什么会这样,以及我如何克服这个问题?

非常感谢你的时间。

1 个答案:

答案 0 :(得分:2)

来自文档:

  

UIViewAnimationOptionTransitionNone -   用于指定不应发生转换的选项。

尝试下列之一:

UIViewAnimationOptionTransitionFlipFromLeft 
UIViewAnimationOptionTransitionFlipFromRight 
UIViewAnimationOptionTransitionCurlUp          
UIViewAnimationOptionTransitionCurlDown       

修改: 或者,如果您只想设置这些值的动画,请尝试

[UIView animateWithDuration:(NSTimeInterval)duration 
                 animations:(void (^)(void))animations 
                 completion:(void (^)(BOOL finished))completion];