2016-01-16 39 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,確保約束已安裝。儘管如此,如果他們所說的話是真實的,那將是不必要的。