gpt4 book ai didi

ios - UIView AnimateWithDuration 永远不会到达完成 block

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:12:25 25 4
gpt4 key购买 nike

我有这段代码,我用它来通过一个漂亮的小动画切换 Root View Controller ,它已经工作了几个月......但后来随机停止工作。

UIView snapshot = [self.window snapshotViewAfterScreenUpdates:YES];
[viewController.view addSubview:snapshot];
self.window.rootViewController = viewController;
NSLog(@"check point 1");
[UIView animateWithDuration:0.3 animations:^{
NSLog(@"check point 2");
snapshot.layer.opacity = 0;
NSLog(@"check point 3");
snapshot.layer.transform = CATransform3DMakeScale(1.5, 1.5, 1.5);
NSLog(@"check point 4");
} completion:^(BOOL finished) {
NSLog(@"check point 5");
[snapshot removeFromSuperview];
NSLog(@"check point 6");
}];

我放入了这些检查点,所有通过检查点 4 的东西都会触发。但是 5 和 6 永远不会触发。对我来说很奇怪,因为即使它失败了,完成 block 仍然应该触发。

在加载的新 Root View Controller 上,请求用户收集他或她的位置的权限。所以也许当那个弹出窗口出现时,它破坏了这个转变?虽然它不习惯。

最佳答案

如果没有任何动画或过渡部分已经由源代码的另一部分完成并且代码片段在不同线程(除了 UI 线程)上运行,则不会调用完成 block 。因此,为了说明,下面代码的完成 block 永远不会触发,

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"check point 1");
[UIView animateWithDuration:10.3 animations:^{
NSLog(@"check point 4");
} completion:^(BOOL finished) {
NSLog(@"check point 5");
[snapshot removeFromSuperview];
NSLog(@"check point 6");
}];
});

要解决这个问题,请将您的代码包含在此代码中,

dispatch_async(dispatch_get_main_queue(), ^{
//Your code, This runs on main thread
});

关于ios - UIView AnimateWithDuration 永远不会到达完成 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37927967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com