Ios 在UIView中需要SnapKit约束的完成块
我在swift中有一个UIView,它使用SnapKit来布局视图。我想模糊其中一个视图,但我需要将模糊代码放在一个方法中,该方法在所有布局代码完成后运行,并且一个视图具有适当的大小 我似乎找不到那个模糊代码的正确位置。因为snapkit都是基于块的,所以它是异步的,我不知道什么时候会完成。我可以使用什么回调方法Ios 在UIView中需要SnapKit约束的完成块,ios,swift,constraints,Ios,Swift,Constraints,我在swift中有一个UIView,它使用SnapKit来布局视图。我想模糊其中一个视图,但我需要将模糊代码放在一个方法中,该方法在所有布局代码完成后运行,并且一个视图具有适当的大小 我似乎找不到那个模糊代码的正确位置。因为snapkit都是基于块的,所以它是异步的,我不知道什么时候会完成。我可以使用什么回调方法 编辑:我报告了一个错误,他们说这些块毕竟是同步的。但是,在layoutSubviews(以及同步块之后)中,我的帧仍然是CGRectZero,因此,模糊代码无法对宽度或高度为0的视图进
编辑:我报告了一个错误,他们说这些块毕竟是同步的。但是,在
layoutSubviews
(以及同步块之后)中,我的帧仍然是CGRectZero
,因此,模糊代码无法对宽度或高度为0的视图进行快照和模糊。我不知道SnapKit,但有一种技术可以用于在完成最后一组异步块后执行代码
诀窍是创建一个类来保存一段代码,并让每个块保存对它的引用。在类的deinit代码中,执行代码
例如:
class CompletionBlock
{
var completionCode:()->()
init?(_ execute:()->() )
{ completionCode = execute }
func deferred() {}
deinit
{ completionCode() }
}
在使用run块调用函数之前,为变量分配CompletionBlock实例,并在每个块中添加对其deferred()函数的调用。然后将变量设置为nil(或者让它从调用函数中超出范围)
完成变量将被两个块捕获,因此将有一个对它的引用(保持它处于活动状态),直到两个块都超出范围。然后,completion变量将超出作用域本身,它的deinit函数将被调用,此时将执行completion块
在您的特定情况下,这可能有帮助,也可能没有帮助,但我想我会把它放进去,以防万一。也许(如果layoutSubviews方法不起作用…)您可以使用类似的方法来确保已安装约束。虽然如果他们说的是真的,这有点不必要。这是一个很棒的主意!!然而,不幸的是,它不能解决这个问题。我试过了,当回调出现时,我想模糊的视图的宽度和高度仍然是0,我想这里还发生了别的事情。
// ...
var completion = CompletionBlock({ print("finished") })
doThis(completion: {
// ... whatever stuff you need to do
completion.deferred()
})
doThat(completion: {
// ... whatever stuff you need to do
completion.deferred()
})
completion = nil
// ....