2017-05-29 22 views
1

這裏是我如何覆蓋我的視圖控制器,但是,如果有另一種更好的方式來做到這一點,使我的第二個視圖控制器不符合覆蓋請直接給我,任何建議將是很好的。如何讓viewWillTransition保持一個視圖控制器而不是全部?

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { 


    coordinator.animate(alongsideTransition: { (UIViewControllerTransitionCoordinatorContext) -> Void in 

     let orient = UIApplication.shared.statusBarOrientation 

     switch orient { 
     case .portrait: 
      print("Portrait") 
      self.applyPortraitConstraint() 
      break 
     // Do something 
     default: 
      print("LandScape") 
      // Do something else 
      self.applyLandScapeConstraint() 
      break 
     } 
    }, completion: { (UIViewControllerTransitionCoordinatorContext) -> Void in 
     print("rotation completed") 
    }) 
    super.viewWillTransition(to: size, with: coordinator) 
} 

func applyPortraitConstraint(){ 
    stackView.axis = .vertical 
    stackView.distribution = .fill 
} 

func applyLandScapeConstraint(){ 
    stackView.axis = .horizontal 
    stackView.distribution = .fillEqually 
} 

回答

1

根據我的理解,這段代碼只能在viewController中工作,它是它的一部分。任何其他viewController不會調用此方法。相反,他們會調用他們自己的方法。我沒有看到其他viewControllers如何能夠使用這段代碼。 除非在所有viewController中使用相同的代碼,否則我會建議僅在viewControllers中使用此代碼,而您確實希望遵循此行爲。

+0

當我運行我的應用程序,它需要通過我的應用程序這種方法,它甚至打印旋轉完成每個我已經旋轉的VC,是我的代碼在一個VC上沒有任何其他VC,因爲這個VC有一個我的stackView的插座,所以這使我困惑 –

+0

在print(「rotation completed」)之前添加'print(self)'並查看self的值是否與所有回調相同或不同 – Malik

+0

另一點需要考慮需要考慮的是,視圖控制器的viewWillTransition(如果它也使用super.viewWillTransition)會將消息傳播到其子視圖控制器。 – Malik

2

儘管你已經找到了解決問題的方法,但我想我會提供一個更簡單的方法來處理它。另一個好處是它不會太脆弱,因爲無論您的控制器中有什麼視圖,它都可以工作。

首先,部分基於已經包含在Malik回答的評論中的信息的一個小上下文:正如Malik指出的,「viewWillTransition」方法將只在包含它的視圖控制器中執行。但是,由於您使用的是標籤欄控制器,因此與標籤欄關聯的每個控制器都會保持存在,即使您在不同的選項卡上也是如此。因此,即使用戶在旋轉設備時位於不同的選項卡控制器上,仍然會在具有該方法的控制器中調用「viewWillTransition」方法。那麼,如果您希望該方法中的代碼僅在該用戶當前位於該選項卡上才能執行?

這裏有一個簡單的解決方案:如果你想這是目前在「viewWillTransition」只有當用戶是控制器的標籤上要調用的代碼,你可以在代碼檢查當前值之前增加一個後衛聲明「tabBarController.selectedIndex」。 「selectedIndex」值告訴你當前選中和可見的選項卡控制器。

例如,假設「viewWillTransition」位於索引控制器的索引爲0的位置。您可以包含一個guard語句,用於檢查selectedIndex是否爲0,如果不是,則返回。如果用戶當前不在標籤0上,這將防止執行該方法中的其餘代碼。如果用戶位於索引爲1並且旋轉設備的標籤上,儘管「viewWillTransition」仍然會被調用在Controller 0中,guard語句將阻止其餘的代碼執行。

下面的代碼:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { 
     super.viewWillTransition(to: size, with: coordinator) 
     guard tabBarController?.selectedIndex == 0 else { return } 
     //Include the rest of your code here 
} 

希望這有助於你或其他人!

+0

解釋和實現是Perrrrrrfect !! –

0

一個更好的版本保護聲明的是:

guard 
    tabBarController?.selectedViewController === self 
else { 
    return 
} 

,這樣你就不會污染與在其中填充選項卡的順序您的視圖控制器實現。

相關問題