在 Xcode beta 2 和 iOS 10 beta 2 之前,我有一个可以正常工作的自定义 UIPresentationController。我没有更改任何代码,但演示文稿现在以标准模式演示文稿呈现。
UIPresentationController 的 Apple 示例代码中有一条注释说:
对于将使用自定义演示控制器的演示,该演示控制器也可以是 transitioningDelegate。这避免了在源视图控制器中引入另一个对象或实现。
transitioningDelegate 不持有对其目标对象的强引用。为了防止在调用 -presentViewController:animated:completion 之前释放presentationController:将NS_VALID_UNTIL_END_OF_SCOPE 属性附加到声明中。
我在演示前后检查了演示视图控制器上的 transitioningDelegate。在它之前是我的自定义 UIPresentationController,但在它之后是 nil。我的猜测是该引用正在发布,但我在 Swift 中找不到与 NS_VALID_UNTIL_END_OF_SCOPE 等效的内容。编辑:我已经验证了 transitioningDelegate 设置到演示之前,然后是 nil 时演示。
我在呈现视图控制器中的代码:
@IBAction func buttonAction(_ sender: UIButton) {
let secondViewController = storyboard!.instantiateViewController(withIdentifier: "NewViewController") as! NewViewController
let presentationController = MyPresentationController(presentedViewController: secondViewController, presenting: self)
presentationController.initialFrame = button.frame
secondViewController.transitioningDelegate = presentationController
// Move map
let pixelsToMove: CGFloat = mapView.frame.height / 4
let region = self.mapView.region
self.mapView.setRegion(region, offsetBy: pixelsToMove, animated: true)
// Delegate to NewViewController
secondViewController.mapView = mapView
mapView.delegate = secondViewController
print(secondViewController.transitioningDelegate)
UIView.animate(withDuration: 0.3, animations: {
let tabBar = self.tabBarController!.tabBar
tabBar.frame.origin.y += tabBar.frame.height
self.present(secondViewController, animated: true, completion: nil)
})
}
我在 UIPresentationController 中的代码:
override init(presentedViewController: UIViewController, presenting presentingViewController: UIViewController?) {
super.init(presentedViewController: presentedViewController, presenting: presentingViewController)
presentedViewController.modalPresentationStyle = .custom
}