2016-01-06 35 views
3

所以我有一些按鈕是通過Interface Builder添加到視圖中的,而不是使用我自定義的系統按鈕。我試圖弄清楚如何改變特性,比如不同狀態下的文本顏色和背景顏色(高亮,聚焦等)。在Swift(tvOS)中,你如何改變UIButton的高光和焦點顏色?

它似乎不能通過IB來完成,所以我可能會創建一個UIButton的子類並在那裏更改它們,但是我很難找到要更改的屬性。我沒有看到他們在文檔中明確提到

回答

5

你絕對是在正確的軌道上!

一旦你繼承的UIButton,你可以重寫功能​​(從UIFocusEnvironment協議,在tvOS這UIButton已經實現)

override func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) { 
    super.didUpdateFocusInContext(context, withAnimationCoordinator: coordinator) 

    if context.nextFocusedView == self { 
     // This is when the button will be focused 
     // You can change the backgroundColor and textColor here 
    } else { 
     // This is when the focus has left and goes back to default 
     // Don't forget to reset the values 
    } 
} 

您還可以得到花哨和改造框架模仿默認的「焦點」影響!

+0

切換到前兩行到下面的夫特3.0:'倍率FUNC didUpdateFocus(在上下文中:UIFocusUpdateContext,與協調器:UIFocusAnimationCoordinator) { super.didUpdateFocus(in:context,with:coordinator)' – adjwilli

+0

非常乾淨,謝謝 – RichAppz

4

除了@Yoseob Lee的回答,你不需要創建一個UIButton子類來實現這一點。只要確保你在Interface Builder選擇custom的UIButton的類型,然後重寫類中的​​方法要改變按鈕的屬性:

override func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) { 
    super.didUpdateFocusInContext(context, withAnimationCoordinator: coordinator) 

    if context.nextFocusedView == myButton { 
     myButton = UIColor.redColor() 
    } else { 
     myButton = UIColor.blueColor() 
    } 
} 
1

以上工作這兩個答案,但對於這樣簡單的改動更容易使用IB爲每個狀態設置屬性。雖然設置稍微隱藏,但確實可以更改文本顏色和背景顏色。

pop up to change state configuration

你可以用下面的方法做相同的代碼:

[aButton setTitleColor:UIColor.greenColor forState:UIControlStateFocused]; 
4

@Yoseob Lee是正確的,但他的回答是缺少一些細節。這是一個稍微更好(主觀)的答案。

override func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) { 
    if context.nextFocusedView === self { 
     coordinator.addCoordinatedAnimations({ 
      // change the appearance as desired 
      }, completion: nil) 
    } else if context.previouslyFocusedView === self { 
     coordinator.addCoordinatedAnimations({ 
      // revert back to default appearance 
      }, completion: nil) 
    } 
} 

注意===而不是==作比較。在大多數情況下比較參考速度更快。此外,將外觀上的任何更改添加到動畫協調器組中都會更改爲默認動畫(和時間),以便外觀上的更改看起來更像是tvOS默認行爲的一部分。此外,確保previouslyFocusedView恢復到默認狀態可減少不必要的操作。

+0

這使得轉換變得流暢。像黃油一樣光滑。 – Nate4436271

+0

完美!答案應該改爲那個;) –

1

夫特3

在迅速3.0的實現:

override func didUpdateFocus(in context: UIFocusUpdateContext, with coordinator: UIFocusAnimationCoordinator) { 

    coordinator.addCoordinatedAnimations({ 
     if self.isFocused { 
      self.button.alpha = 1.0 // in focus 
     } 
     else { 
      self.button.alpha = 0.0 // leaving focus 
     } 
     }, completion: nil) 

} 
相關問題