嗨,我有一段代码只有一行不能正常工作......
[UIView animateWithDuration:0.3 delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^{
[label setFrame:CGRectMake(0, 0, frame.size.width, kStandardLabelHeight)]; //working
[self.currentLabel setFrame:CGRectOffset(self.currentLabel.frame, frame.size.width, 0)]; //not working
[self.currentLabel setAlpha:0.0f]; //working
} completion:^(BOOL finished) {
[self.currentLabel removeFromSuperview];
self.currentLabel = label;
}];
我的想法已经用完了......
答案 0 :(得分:2)
我发现的是:如果我关闭"使用自动布局",那么它神奇地工作,所以这个问题与自动布局有关。
搜索后,我发现:http://weblog.invasivecode.com/post/42362079291/auto-layout-and-core-animation-auto-layout-was
为您的视图添加约束出口映射,然后更新约束,而不是使用setFrame!
下面是我的最终实现(_topConstraint是表视图的顶部垂直空间约束):
- (IBAction)switchButtonTouched:(id)sender
{
if (_topConstraint.constant <= 0)
_topConstraint.constant = _buttonView.frame.size.height;
else
_topConstraint.constant = 0;
[_tableView setNeedsUpdateConstraints];
[UIView animateWithDuration:0.5f animations:^(void){
[_tableView layoutIfNeeded];
} completion:^(BOOL finished){
}];
}
答案 1 :(得分:0)
帧必须是带有4个参数的CGRect
:( xPosition,yPosition,width,height)。使用CGRectMake
设置框架
self.currentLabel.frame = CGRectMake(100, 100, self.currentLabel.frame.size.width, self.currentLabel.frame.size.height)
您将动画持续时间设置为0.3秒,当它结束时,您将其从视图中删除。这是太短了。设置示例2的持续时间,您将看到标签正在移动。
答案 2 :(得分:0)
有时你应该在动画之后设置动画视图的帧,例如在完成块中,尝试类似的东西
[UIView animateWithDuration:0.3 delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^{
[label setFrame:CGRectMake(0, 0, frame.size.width, kStandardLabelHeight)]; //working
[self.currentLabel setFrame:CGRectOffset(self.currentLabel.frame, frame.size.width, 0)]; //not working
[self.currentLabel setAlpha:0.0f]; //working
} completion:^(BOOL finished) {
self.frame = currentLabelFrame;
label.frame = label.frame;
[self.currentLabel removeFromSuperview];
self.currentLabel = label;
}];
答案 3 :(得分:-1)
如果您的问题既不是Autolayout相关的,也不是此处列出的其他问题,那么还有另一个可能的问题,那就是我的问题。我同时在占用相同屏幕空间的视图上运行UIView转换(transitionFromView:toView :)(不同的超视图,不相关,除了在总体视图控制器的超视图中定位)。
我的代码看起来像这样:
[UIView transitionFromView:self.someView
toView:self.someOtherView
duration:0.6f
options:UIViewAnimationOptionTransitionCrossDissolve | UIViewAnimationOptionShowHideTransitionViews
completion:NULL];
[UIView animateWithDuration:0.3
delay:0.0 options:UIViewAnimationOptionCurveEaseOut
animations:^{
[self.someThirdView setFrame:someFrame]; //not working
[self.someThirdView setAlpha:1.0f]; //working
} completion:nil];
框架已更改,但它会弹出到新框架而不是动画。我猜这是一个内部的iOS问题。一旦我删除了&#34; transitionFromView:...&#34;调用,帧动画工作正常。
我现在的解决方案是将第二个动画移动到transitionFromView的完成块。它并不完美,因为这两个动画应该排成一列,但现在它是一个可以通过的解决方案。