所以我有一些按鈕是通過Interface Builder添加到視圖中的,而不是使用我自定義的系統按鈕。我試圖弄清楚如何改變特性,比如不同狀態下的文本顏色和背景顏色(高亮,聚焦等)。在Swift(tvOS)中,你如何改變UIButton的高光和焦點顏色?
它似乎不能通過IB來完成,所以我可能會創建一個UIButton的子類並在那裏更改它們,但是我很難找到要更改的屬性。我沒有看到他們在文檔中明確提到
所以我有一些按鈕是通過Interface Builder添加到視圖中的,而不是使用我自定義的系統按鈕。我試圖弄清楚如何改變特性,比如不同狀態下的文本顏色和背景顏色(高亮,聚焦等)。在Swift(tvOS)中,你如何改變UIButton的高光和焦點顏色?
它似乎不能通過IB來完成,所以我可能會創建一個UIButton的子類並在那裏更改它們,但是我很難找到要更改的屬性。我沒有看到他們在文檔中明確提到
你絕對是在正確的軌道上!
一旦你繼承的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
}
}
您還可以得到花哨和改造框架模仿默認的「焦點」影響!
除了@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()
}
}
@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
恢復到默認狀態可減少不必要的操作。
這使得轉換變得流暢。像黃油一樣光滑。 – Nate4436271
完美!答案應該改爲那個;) –
夫特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)
}
切換到前兩行到下面的夫特3.0:'倍率FUNC didUpdateFocus(在上下文中:UIFocusUpdateContext,與協調器:UIFocusAnimationCoordinator) { super.didUpdateFocus(in:context,with:coordinator)' – adjwilli
非常乾淨,謝謝 – RichAppz