在重叠的动画块中设置UIView的frame属性会导致跳转

时间:2012-07-30 21:13:58

标签: objective-c ios uiview

(iOS 5.1,XCode 4.4) 在我正在进行的项目中,我有两个控制器,它们分别设置相同UIView的框架属性(分别设置大小和位置),在时间上重叠的单独动画块中(第二个动画块在第一个动画块之前启动)完成)。这似乎导致了UIView位置的奇怪跳跃(非动画变化)。

要重现的最小示例(放置在新的单个视图项目(iphone)的viewcontroller中,并将某个按钮连接到action方法)。

@interface ViewController ()

@property (nonatomic, strong) UIView *viewA;

@end

@implementation ViewController

- (IBAction)buttonPressed
{
    // Animate
    [UIView animateWithDuration:5 animations:^{
        self.viewA.frame = CGRectMake(0, self.viewA.frame.origin.y, 320, 200);
    }];
    [UIView animateWithDuration:5 animations:^{
        self.viewA.frame = CGRectMake(0, 200, 320, self.viewA.frame.size.height);
    }];
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.viewA = [[UIView alloc] init];
    self.viewA.backgroundColor = [UIColor orangeColor];
    self.viewA.frame = CGRectMake(0, 100, 320, 100);
    [self.view addSubview:self.viewA];
}

@end

按下按钮,您将看到视图跳跃大约50个像素(移动距离的一半)。

如果有人知道为什么会这样,和/或如何解决这个问题,我很乐意听取您的意见。提前谢谢你,

帕特里克

2 个答案:

答案 0 :(得分:2)

您可以使用UIViewAnimationOptionBeginFromCurrentState选项来避免跳转:

[UIView animateWithDuration:5.0 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
    self.viewA.frame = CGRectMake(0, 200, 320, self.viewA.frame.size.height);
} completion:nil];

答案 1 :(得分:0)

这就是块的工作原理,你同时做两个动画,试试这个。

[UIView animateWithDuration:5 animations:^{
    self.viewA.frame = CGRectMake(0, self.viewA.frame.origin.y, 320, 200);

 } 
completion:^(BOOL finished) {
    self.viewA.frame = CGRectMake(0, 200, 320, self.viewA.frame.size.height);
 }
];