【问题标题】:iOS autolayout animation doesn't work on iOS 7 but works on iOS 8iOS 自动布局动画不适用于 iOS 7,但适用于 iOS 8
【发布时间】:2015-01-11 16:05:12
【问题描述】:

我正在尝试为从左侧滑入并使用整个空间的全屏视图设置动画。

我有以下代码在 iOS 8 上完美地完成了预期的工作,但在 iOS 7 上却失败了:

[source.view addSubview:destination.view];

NSDictionary *viewsDict = @{@"tableView":destination.tableView,
                            @"tapView": destination.tapView,
                            @"destinationView": destination.view};

[source.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[destinationView]|" options:0 metrics:nil views:viewsDict]];

source.leftConstraint = [NSLayoutConstraint constraintWithItem:destination.tableView
                                         attribute:NSLayoutAttributeLeft
                                         relatedBy:NSLayoutRelationEqual
                                            toItem:source.view
                                         attribute:NSLayoutAttributeLeft
                                        multiplier:1.0
                                          constant:-source.view.bounds.size.width];

[source.view addConstraint:source.leftConstraint];

source.rightConstraint = [NSLayoutConstraint constraintWithItem:source.view
                                         attribute:NSLayoutAttributeTrailing
                                         relatedBy:NSLayoutRelationEqual
                                            toItem:destination.tapView
                                         attribute:NSLayoutAttributeTrailing
                                        multiplier:1.0
                                          constant:source.view.bounds.size.width];

[source.view addConstraint:source.rightConstraint];

[source.view layoutIfNeeded];

[UIView animateWithDuration:.35f animations:^{

    source.rightConstraint.constant = 0;
    source.leftConstraint.constant = 0;

    [source.view layoutIfNeeded];

}];

在 iOS 7 上执行此操作时,destination.view 会立即添加到屏幕上,而不会出现任何动画。知道为什么会这样吗?

【问题讨论】:

  • 您解决了吗?看到同样的问题。
  • 我稍微更改了我的代码,现在我在 iOS 7 和 iOS 8 上的行为一致,但这段代码的行为仍然不同。

标签: ios ios7 ios8 autolayout


【解决方案1】:

你的动画块应该只包含[source.view layoutIfNeeded];(见How do I animate constraint changes?)。

您应该在块之前更改约束,如下所示:

[source.view layoutIfNeeded];

source.rightConstraint.constant = 0;
source.leftConstraint.constant = 0;

[UIView animateWithDuration:.35f animations:^{

    [source.view layoutIfNeeded];

}];

【讨论】:

  • @session 232 from 2012 wwdc at 56min 说明您需要设置起始约束,然后调用layoutIfNeeded,然后在动画块中 - 更改约束的常量并再次调用layoutIfNeeded ?这是我的代码所遵循的来源。
  • 自那以后,机制可能发生了变化。我在我的应用程序中使用了上面的代码,它在 iOS 7 和 8 中都可以使用。也许你可以试试看它是否有效?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-16
  • 2015-07-19
相关资源
最近更新 更多