我在swift中有一个UIView,使用SnapKit来布局它的视图。我想模糊其中一个视图,但我需要将模糊代码放在一个方法中,该方法在所有布局代码完成后运行,并且一个视图的大小合适。
我似乎无法找到适合该模糊代码的地方。由于snapkit都是基于块的,所以它都是异步的,我不知道什么时候会完成。我可以使用什么回调方法?
编辑:我报告了一个issue on SnapKit,他们说这些块毕竟是同步的。但是,在layoutSubviews
(以及同步块之后),我的帧仍然是CGRectZero
,因此模糊代码无法快照并模糊0宽度或高度的视图。
答案 0 :(得分:2)
我不知道SnapKit,但是有一种技术可以用来在完成最后一堆异步块之后执行代码。
诀窍是创建一个类来保存代码片段并让每个块保存对它的引用。在类的deinit代码中,执行代码。
示例:
class CompletionBlock
{
var completionCode:()->()
init?(_ execute:()->() )
{ completionCode = execute }
func deferred() {}
deinit
{ completionCode() }
}
在使用run blocks调用函数之前,使用CompletionBlock实例分配一个变量,并在每个块中添加对其deferred()函数的调用。然后将变量设置为nil(或让它超出调用函数的范围)
// ...
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
// ....
两个块将捕获完成变量,因此将引用它(保持活动状态),直到两个块都超出范围。然后,完成变量将超出范围本身,并且将调用其deinit函数,在此时执行完成块。
这可能会或可能不会对您的具体情况有所帮助,但我想我会把它丢进去,以防万一。
答案 1 :(得分:-1)
也许(如果layoutSubviews方法不工作......)你可以使用类似dispatch group的东西来确保已经安装了约束。虽然这有点不必要,但如果他们说的是真的。