2016-01-23 22 views
3

我一直試圖聚焦第一個按鈕,但是聚焦引擎將第三個按鈕放在標籤欄正下方作爲要聚焦的第一個項目。我嘗試了首選焦點視圖,但發現當我按垂直順序放置按鈕時,首選將首選視圖進行聚焦,但是當我將所有按鈕放置在水平平面中時,總是會按第三個按鈕。另一種方法是,我可以想想如果聚焦指南,但我想知道如何在這種情況下工作?tvOS:當按鈕處於水平順序時,將第一個按鈕作爲首選焦點視圖

override weak var preferredFocusedView: UIView? { 
     get { 
      return thrirdButton 
     } 
    } 

這是因爲聚焦引擎取最近的可能聚焦元件作爲第一元件作爲可以從attached.I已附加的視圖控制器的上下文截圖的圖片中看到。任何幫助或線索解決這個將不勝感激。

Focus path expected-Blue vs default-Red Context Path

回答

2

嘗試添加UIFocusGuide正上方的按鈕的行。在這種情況下,在到達按鈕之前,它會打到您的重點指南,您可以將preferredFocusedView重定向到該特定按鈕。要重定向的代碼是通過重寫didUpdateFocusInContext方法來完成的。

假設你有設置在viewDidLoad中的焦點引導,以下是一個示例,

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

    self.focusGuide.preferredFocusedView = self.mypreferredbutton 
} 

初始化的聚焦引導(做加法引導的,以查看在viewDidLoad中)

var focusGuide = UIFocusGuide() 

    self.view.addLayoutGuide(self.sidefocusGuide) 
    self.focusGuide.leftAnchor.constraintEqualToAnchor(self.placerLabel.leftAnchor).active = true 
    self.focusGuide.rightAnchor.constraintEqualToAnchor(self.placerLabel.rightAnchor).active = true 
    self.focusGuide.topAnchor.constraintEqualToAnchor(self.audioTable.topAnchor).active = true 

我也面臨類似的問題,但不知何故能夠通過這個做到這一點。 preferredFocusedView方法也可以工作,但是你必須通過更新一些引用變量然後爲該視圖調用setneedsfocusupdate來做很多馬戲團。嘗試重點指南的方式。希望能幫助到你。

編輯: 我已經添加了代碼如何設置指南。在這種情況下,我已將指南放在了我的觀點的右側。因此,無論何時您的焦點碰到指南,它都會重定向到您希望焦點轉到didUpdateFocusInContext中的首選focusocus視圖。 「任何時候都只有一個焦點。」,請記住那些?所以,當它碰到指南的那一刻,重寫方法就會被擊中,從而將你的焦點轉移到指南的首選視圖。例如,你可以參考蘋果的UIKitCatlog應用程序的tvOS和這是一個link解釋相同。

+0

感謝您的答覆巴蒂爾:我試圖通過引導將優先重點的看法,但它並沒有幫助。我沒有使用過很多的指南,我是tvOS的新手,你能不能分享一下創建指南的想法,就像你在案例中那樣擊中第一個按鈕? –

+0

再次通過我的答案。已經添加和編輯了一些更多的參考。 –

+0

謝謝謝恩 - 我經歷了教程,它真的幫助。所以如果我們想要像這樣做任何自定義導航,我們需要添加一個焦點指南,並根據didupdateFocus委託方法的要求重定向。 –

1

解決方案: 我們需要在按鈕3上方添加聚焦指南,並在聚焦指南聚焦時將其重定向到按鈕1。

private var focusGuide = UIFocusGuide() 
self.view.addLayoutGuide(focusGuide) 

    self.focusGuide.bottomAnchor.constraintEqualToAnchor(self.button3.topAnchor).active = true 
    self.focusGuide.leftAnchor.constraintEqualToAnchor(self.button3.leftAnchor).active = true 
    // Width and height 
    self.focusGuide.widthAnchor.constraintEqualToAnchor(self.button3.widthAnchor).active = true 
    self.focusGuide.heightAnchor.constraintEqualToAnchor(self.button3.heightAnchor).active = true 
    focusGuide.centerXAnchor.constraintEqualToAnchor(self.button3.centerXAnchor).active = true 


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

     self.focusGuide.preferredFocusedView = button1 
    } 

​​

+0

此外,將焦點指南的長度延伸到按鈕的全部4個上方將是適當的。這樣,每當焦點來自上面時,它所觸及的第一件事就是您的指南,而不是其他任何按鈕。 –