在UIView中需要SnapKit约束的完成块

时间:2016-01-16 02:08:43

标签: ios swift constraints

我在swift中有一个UIView,使用SnapKit来布局它的视图。我想模糊其中一个视图,但我需要将模糊代码放在一个方法中,该方法在所有布局代码完成后运行,并且一个视图的大小合适。

我似乎无法找到适合该模糊代码的地方。由于snapkit都是基于块的,所以它都是异步的,我不知道什么时候会完成。我可以使用什么回调方法?

编辑:我报告了一个issue on SnapKit,他们说这些块毕竟是同步的。但是,在layoutSubviews(以及同步块之后),我的帧仍然是CGRectZero,因此模糊代码无法快照并模糊0宽度或高度的视图。

2 个答案:

答案 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的东西来确保已经安装了约束。虽然这有点不必要,但如果他们说的是真的。