2016-01-16 38 views
1

我有一个UIView在swift中使用SnapKit来布置它的视图。我想模糊其中一个视图,但我需要将模糊代码放在一个方法中,该方法在所有布局代码完成后运行,并且一个视图具有适当的尺寸。需要UIView的SnapKit约束完成块

我似乎无法弄清楚模糊代码去的正确位置。由于snapkit全部基于块,所有都是异步的,我不知道它何时完成。我可以使用什么回调方法?

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

回答

2

我不知道SnapKit,但是有一种技术可以用来在一堆异步块的最后一个完成之后执行代码。

诀窍是创建一个类来保存你的一段代码,并让每个块保存对它的引用。在这个类的deinit代码中,你执行你的代码。

实施例:

class CompletionBlock 
{ 
    var completionCode:()->() 

    init?(_ execute:()->()) 
    { completionCode = execute } 

    func deferred() {} 

    deinit 
    { completionCode() } 
} 

调用带运行框中所示的功能之前,分配一个变量与CompletionBlock的实例,并在每个块添加到它的延迟()函数的调用。然后设置为零变量(或让它走出去的范围从调用函数)

// ... 
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函数将被调用,在那时执行你的完成块。

这可能会也可能不会帮助您的具体情况,但我想我把它扔进去,以防万一。

+0

这是一个很棒的主意!然而,不幸的是这个问题不起作用。我试过了,我想模糊的视图在回调出现的时候仍然是0宽度和高度,我认为这里还有别的事情要做。 – teradyl

-1

也许(如果layoutSubviews方法是不工作...),你可以使用像一个dispatch group,确保约束已安装。尽管如此,如果他们所说的话是真实的,那将是不必要的。