【发布时间】:2015-01-15 14:17:23
【问题描述】:
我正在构建一个页面浏览器,它将页面动画化为“纸张”被拉到一堆纸上。为了保持流畅的动画,我使用了 3 个相互堆叠的 UIView。这三个视图包含当前页面(顶部)、上一页(中间)和下一页(底部)。
在下面的代码中,我想将顶视图拖到右侧,露出下面的上一页。这工作正常。但是,在那之后,我需要将顶部页面移动到堆栈的底部,以便为用户下次翻页时准备三个视图的堆栈。我为此使用了 sendSubviewToBack 方法。
我的问题是 ViewSample[Top] 在动画开始后立即发送到堆栈底部。如何强制动画在被发送到堆栈底部之前完成(以便 ViewSample[Top] 完全移出屏幕)?
ViewSample[Top].center = CGPointMake(x,y);
[UIView animateWithDuration:0.5
animations:^
{
ViewSample[Top].center = CGPointMake(x+w,y); //slide away to the right
}
completion:^(BOOL finished)
{
}
];
[self.MainView sendSubviewToBack:ViewSample[Top]];
编辑
我刚刚遇到了一个非常奇怪的行为,这与我的问题有关。 我听从了您的建议,发现动画“已完成”部分的行为取决于 AFTERWARDS 后设置的变量“top”的值:
ViewSample[Top].center = CGPointMake(x,y);
[UIView animateWithDuration:0.5
animations:^
{
ViewSample[Top].center = CGPointMake(x+w,y); //slide away to the right
}
completion:^(BOOL finished)
{ [self.MainView sendSubviewToBack:ViewSample[Top]];
}
];
Top++; // THIS COMMAND AFFECTS THE LINE ABOVE!!!
换句话说,当我添加“Top++;”行时即使语句 sendSubviewToBack 先出现,另一个 View 也会移回堆栈上。这让我很困惑。这有意义吗?是bug吗?
【问题讨论】: