2017-08-28 40 views
0

需要你的一些偉大的知識:)調用一個函數的UIButton:當isHighlighted = true時,我只能通過刷我的手指

我寫的UIButton(CustomWideButton.swift)的子類,而使用的UIButton對象。我這樣做是因爲它對於我需要創建的按鈕類型更加靈活。

有一個奇怪的事情,我不知道這是否是一個正常的行爲。

var isHighlighted在點擊正常的按鈕區域時被調用。所以,如果我寫的是這樣的:

var isHighlighted { 
    didSet { 
     print("I am Highlighted") 
     animateHighlight() 
    } 
} 

我會在控制檯「我突出了」看,但它不會調用animateHighlight()除非我有點開始刷卡我的手指上的按鈕。如果我這樣做,那麼animateHighlight()的作品。

我張貼到位桶的樣本項目,所以它會更容易讓你瞭解我面臨的問題: https://bitbucket.org/stephaneDepoilly/stackohighlightedbutton

直接鏈接,郵編:https://bitbucket.org/stephaneDepoilly/stackohighlightedbutton/get/ee4fc398f475.zip

我很抱歉,如果自定義按鈕代碼看起來有點過分,這是因爲我從我的項目中部分提取了它,並且使用了MVVM。

在此先感謝您的幫助!

回答

2

您的調試信息會誤導您。我換成你print

NSLog("isHighlighted on \(title) set to \(isHighlighted)") 

我加入的第一行animateHighlight()

NSLog("animateHighlight enter: triggered by isHighlighted on \(title) set to \(isHighlighted)") 

而且我得到了:

2017-08-27 21:57:34.870 StackO_HighlightFunctionCall isHighlighted on [...LOGIN...] set to true 
2017-08-27 21:57:34.871 StackO_HighlightFunctionCall animateHighlight enter: triggered by isHighlighted on [...LOGIN...] set to true 
2017-08-27 21:57:35.000 StackO_HighlightFunctionCall isHighlighted on [...LOGIN...] set to false 
2017-08-27 21:57:35.000 StackO_HighlightFunctionCall animateHighlight enter: triggered by isHighlighted on [...LOGIN...] set to false 

所以:

1)animateHighlight當你告訴它被調用時確實被調用。使用DebuggerForce!

2)isHighlighted狀態開關在設置爲true後很快(0.13秒)回到假。你有期待嗎?

3)animateHighlight是越野車,並沒有產生任何明顯的變化。如果仔細追蹤代碼,則在更新標籤的文本後,您會看到setupUI()被調用。這是因爲您從layoutSubviews()呼叫setupUI()layoutSubviews在運行時一直被稱爲當任何關於視圖的變化可能會影響子視圖setupUI只有當視圖被添加到其超級視圖時才應該被稱爲,例如,在viewDidLoad()

究其原因,刷卡工作原理是,layoutSubviews()延遲直到完成刷卡,因爲它是.touchUpInside事件觸發龍頭作用,但isHighlighted被隱藏UIButton.touchDownInside處理觸發!

+0

非常感謝您的分析BaseZen! 我刪除了animateHighlight()的else條件,因爲當* isHighlight = false *時,無論如何都會回到它的原始狀態。 我現在更好地瞭解圖片。我的問題已修復。 – Carmelo

相關問題