2

嗨,我有一段代码,只有一行不起作用...

[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;
}];

我已经没有想法了,这是怎么回事......

4

4 回答 4

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){
    }];
}
于 2014-05-13T02:04:29.093 回答
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;
}];
于 2013-12-06T09:41:00.850 回答
0

Frame 必须是CGRect带有 4 个参数的:(xPosition,yPosition,width,height)。用于CGRectMake设置框架

self.currentLabel.frame = CGRectMake(100, 100, self.currentLabel.frame.size.width, self.currentLabel.frame.size.height)

您将动画持续时间设置为 0.3 秒,并在结束时将其从视图中移除。这是太短了。将持续时间设置为示例 2,您将看到您的标签正在移动。

于 2013-09-22T17:32:59.453 回答
-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问题。一旦我删除了“transitionFromView:...”调用,帧动画就可以正常工作了。

我现在的解决方案是将第二个动画移动到 transitionFromView 的完成块中。这并不完美,因为两个动画应该排成一列,但它现在是一个可以接受的解决方案。

于 2014-08-20T16:19:47.780 回答