相关疑难解决方法(0)

drawViewHierarchyInRect:afterScreenUpdates:延迟其他动画

在我的应用程序中,我使用drawViewHierarchyInRect:afterScreenUpdates:以获取我的视图的模糊图像(使用Apple的UIImage类别UIImageEffects).

我的代码看起来像这样:

UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 0);
[self.view drawViewHierarchyInRect:self.view.bounds afterScreenUpdates:YES];
UIImage *im = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
/* Use im */
Run Code Online (Sandbox Code Playgroud)

我在开发过程中注意到,在使用我的应用程序之后,我的许多动画都被延迟了,即,与应用程序的全新启动相比,我的视图在显着(但不到大约一秒)暂停之后开始动画.

经过一些调试后,我注意到仅使用drawViewHierarchyInRect:afterScreenUpdates:屏幕更新设置YES导致此延迟.如果在使用会话期间从未发送此消息,则永远不会出现延迟.使用NO的屏幕更新参数也做出了延迟消失.

奇怪的是,这个模糊的代码延迟的动画完全无关(据我所知).有问题的动画不使用 drawViewHierarchyInRect:afterScreenUpdates:,它们是CAKeyframeAnimation动画.仅发送此消息(屏幕更新设置为YES)的行为似乎在我的应用程序中全局影响了动画.

这是怎么回事?

(我创建了说明效果的视频:没有动画延迟.请注意导航栏中"Check!"语音气泡的外观延迟.)

UPDATE

我已经创建了一个示例项目来说明这个潜在的错误.https://github.com/timarnold/AnimationBugExample

更新2号

我收到Apple的回复,证实这是一个错误.见下面的答案.

cocoa-touch core-animation objective-c ios

27
推荐指数
1
解决办法
2万
查看次数

iOS Swift:UIViewControllerAnimatedTransitioning结束帧位置错误

我有一个Swift项目,学习天气API,并试图更好地处理AnimatedTransitions.我有一个UITableView使用UITableViewCell图像和文字的自定义.点击tableView中的单元格转换为新UIViewController的Show(推送),整个内容嵌入到UINavigationController.

当调用转换时,来自单元的图像应该移动到UIImageView目标viewController上的最终位置.但是,它的作用是在转换完成并且视图发生变化之前移过该点到屏幕的远端,使图像看起来快照回到视图的中心.

截图

我已经阅读了很多教程试图解决这个问题,并且已经阅读了很多StackOverflow,但未能弄明白.有人可以向我指出我错过了什么吗?我疯了,在这里.

在原始ViewController中调用转换的segue:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
  self.performSegueWithIdentifier("SHOW_DETAIL", sender: self)
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
  if segue.identifier == "SHOW_DETAIL" {
    let detailVC = segue.destinationViewController as DetailViewController
    let indexPathForForecast = self.tableView.indexPathForSelectedRow() as NSIndexPath!
    let detailForecast = self.forecasts?[indexPathForForecast.row]
    let cell = self.tableView.cellForRowAtIndexPath(indexPathForForecast) as WeatherCell
    let image = cell.forecastImage.image
    detailVC.forecastForDetail = detailForecast
    detailVC.forecastDetailImage = image
  }
}

func navigationController(navigationController: UINavigationController, animationControllerForOperation operation: UINavigationControllerOperation, fromViewController fromVC: UIViewController, …
Run Code Online (Sandbox Code Playgroud)

uiviewcontroller uiviewanimation ios swift

4
推荐指数
1
解决办法
2677
查看次数

当主视图分离时,如何使视图保持在屏幕上?

如何在每次视图分段时创建一个看似不重新加载的视图(停留在屏幕上)?就像Apple iOS播客应用中的音频控件一样.看图片看我正在引用的音频控件.

我如何在故事板中做到这一点?

在此输入图像描述

podcast uitoolbar uitabview ios swift

4
推荐指数
1
解决办法
1030
查看次数

视图控制器转换动画子视图位置

我正在尝试在两个视图控制器之间创建一个简单的过渡动画,两个视图控制器都具有相同的标签.我只想将标签从第一个视图控制器中的位置动画到第二个视图控制器中的位置(见下图).

查看控制器图

我已经设置了我的视图控制器以使用自定义动画控制器,我可以通过插座访问视图控制器和标签.

在动画块中,我只是将第一个视图控制器上的标签框架设置为第二个视图控制器上的标签框架.

[UIView animateWithDuration:self.duration animations:^{
    fromViewController.label.frame = toViewController.titleLabel.frame;
} completion:^(BOOL finished) {
    [transitionContext completeTransition:finished];
}];
Run Code Online (Sandbox Code Playgroud)

而不是标签从屏幕中间移动到左上角的预期效果,一旦动画开始,标签就位于右下角,然后动画到中间.

我尝试预先打印出标签的位置,这显示了我在故事板中看到的相同框架:

fromViewController.label.frame: {{115.5, 313}, {144, 41}}
toViewController.titleLabel.frame: {{16, 12}, {144, 41}}
Run Code Online (Sandbox Code Playgroud)

我不知道为什么我没有得到预期的行为,以及它取而代之的是什么.

关于我可以改变什么以使我的动画正确运行以及为什么我看到这种行为的任何建议将不胜感激.

animation objective-c uiviewcontroller ios

4
推荐指数
1
解决办法
2057
查看次数