[英]UIViewController custom transition stuck on iOS13
我在我的 iOS 應用程序中實現了兩個視圖控制器之間的自定義轉換,並且它在 iOS 10、11 和 12 上運行良好。
現在我想使用 Xcode 11 beta 6 和 iOS 13 beta 8 為 iOS 13 做好准備,但轉換被卡住了。
自定義過渡應該將第一個視圖控制器向上移出屏幕,第二個從下向上移動。 但現在它回退到 iOS13 默認呈現樣式pageSheet
,只需將第一個視圖控制器縮小一點並添加一個變暗的疊加層。 但是第二個視圖沒有出現。
我發現在animatePresentation(context: UIViewControllerContextTransitioning)
, context
不返回“來自”視圖,因此context.view(forKey: .from)
返回nil
。
如果沒有“來自”的觀點,我該怎么辦?
FlyUpTransition.swift
class FlyUpTransition: NSObject, UIViewControllerAnimatedTransitioning {
var mode: Mode = .present
enum Mode {
case present
case dismiss
}
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return TimeInterval(0.45)
}
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
switch mode {
case .present:
animatePresentation(context: transitionContext)
case .dismiss:
animateDismissal(context: transitionContext)
}
}
func animatePresentation(context: UIViewControllerContextTransitioning) {
guard let fromView = context.view(forKey: .from), let toView = context.view(forKey: .to) else { return }
...
}
func animateDismissal(context: UIViewControllerContextTransitioning) {
guard let fromView = context.view(forKey: .from), let toView = context.view(forKey: .to) else { return }
...
}
}
TL; 博士
這是 iOS 中的一個錯誤,但您可以使用context.viewController(forKey:.from).view
作為解決方法。
完整詳情
這似乎是 iOS 13.0 中的一個錯誤。 從 iOS 13.1 beta 3 開始,它仍然存在。 http://www.openradar.me/radar?id=4999313432248320
在某些情況下,轉換上下文的view(forKey:)
方法錯誤地返回 nil。 當呈現視圖控制器以非模態方式呈現時,這似乎發生在view(forKey: .from)
。 當解除最初從非模態視圖控制器呈現的視圖控制器時, view(forKey: .to)
的結果也為零。
我不僅在 iPhone 上的新表單樣式演示中觀察到了這一點,而且在 iPad 上的正常表單和彈出窗口中也觀察到了這一點。
這個問題的另一個表現似乎是當被問及這個視圖控制器的最終幀應該是什么時, finalFrame(for:)
方法返回一個不正確的CGRect
。 在我的測試中,即使正確的視圖較小,它也會返回全屏矩形。
一種解決方法是使用viewController(forKey:)
方法返回的視圖控制器的根視圖控制器,盡管文檔明確反對:“此方法返回的視圖可能是也可能不是相應視圖控制器的根視圖。”
好吧,這很容易,盡管這是 Apple 的一個重大 API 更改。
viewController.modalPresentationStyle = .fullScreen
現在我必須完成我的整個項目並檢查所有模態演示是否仍然符合我的需要。
上面的答案是將modalPresentationStyle
設置為.fullScreen
是正確的,但是還值得一提的是,如果您的視圖控制器嵌入在UINavigationController
,則需要在導航控制器上設置它:
navigationController.modalPresentationStyle = .fullScreen
我通過從一個集合 VC 拖放到另一個 VC 來設置 IB 中的 segue,用於顯示詳細信息。
我對這個問題有了新的發現,參考'toView'和'fromView',下面兩種方法都可以
間接方式:
transitionContext.viewController(forKey: .to)?.view
transitionContext.viewController(forKey: .from)?.view
直接方式:
transitionContext.view(forKey: .to)
transitionContext.view(forKey: .from)
但是,當我將 segue 樣式切換為“全屏顯示”時,“toView”和“fromView”的直接方式返回“nil”,並且僅間接方式起作用。
希望這會對將來的某人有所幫助。
PS這是我在解決另一個問題的過程中的發現,如果您還遇到“工作動畫師”在iOS 13及更高版本中停止工作的問題,這可能會有所幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.