iOS 13下的modalPresentationStyle = UIModalPresentationFullScreen在MFMessageComposeViewController中无效

4

众所周知,iOS 13+ 模态展示风格对于普通 UIViewController 默认为 .pageSheet。如果您想更改它,可以在呈现时将其更改为所需的样式。我在我的应用程序中使用 MFMailComposeViewController 和 MFMessageComposeViewController 来分享内容。在 MFMailComposeViewController 的情况下,当我选择 modalPresentationStyle = .fullScreen 时,它完美地正常工作...但在 MFMessageComposeViewController 的情况下则不然。请查看下面的代码片段。

        if (MFMessageComposeViewController.canSendText()) {
            let controller = MFMessageComposeViewController()
            controller.body =Message Body”
            controller.messageComposeDelegate = self
            controller.modalPresentationStyle = .fullScreen
            self.present(controller, animated: true, completion: nil)
            self.trackEvent(shareType: "SMS")
        }
    }

我的回答没有帮到你吗? - Alex.Pinhasov
@Alex.Pinhasov,谢谢你的帮助,但我并不是在寻找自定义实现,我只是想确认一下我的方法是否有误。但似乎MFMailComposeViewController本身存在问题。 - iGauravK
@iGauravK,您能告诉我,您解决了这个问题吗?是如何解决的? - Usama Azam
@UsamaAzam 因为模态呈现样式在这种情况下不起作用,而且我不想使用任何自定义转换,所以答案是否定的。 - iGauravK
1个回答

0

虽然我无法回答您为什么不能在MFMessageComposeViewController中使用.fullScreen的问题,但我可以告诉您,如果您实现自己的自定义转换,您将获得所需的行为。

以下是设置视图控制器自定义转换的方法:

var customTransitionDelegate = CustomTransition(presentAnimation: CustomActionSheetPresentationTransition(), dismissAnimation: CustomActionSheetDismissalTransition())

 if (MFMessageComposeViewController.canSendText()) {
     let controller = MFMessageComposeViewController()
     controller.body = "Message Body"
     controller.messageComposeDelegate = self
     controller.modalPresentationStyle = .custom
     controller.transitioningDelegate = customTransitionDelegate
     self.present(controller, animated: true, completion: nil)
 }

你还应该遵循委托并检查结果,在用户点击取消后将其关闭:

    func messageComposeViewController(_ controller: MFMessageComposeViewController, didFinishWith result: MessageComposeResult) {
    switch result {
    case .cancelled:
        self.presentedViewController?.dismiss(animated: true, completion: nil)
    default: break
    }
}

展示逻辑

class CustomActionSheetPresentationTransition: NSObject, UIViewControllerAnimatedTransitioning {
private let duration = 0.6

func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
    guard let fromView = transitionContext.viewController(forKey: .from) else { return }
    guard let toView   = transitionContext.viewController(forKey: .to) else { return }

    var screenOffUp = CGAffineTransform()
    let container = transitionContext.containerView

    screenOffUp = CGAffineTransform(translationX: 0, y: -fromView.view.frame.height)
    toView.view.frame = CGRect(x: 0, y: UIScreen.main.bounds.height, width: fromView.view.frame.width, height: fromView.view.frame.height)

    toView.view.center.x = container.center.x
    container.addSubview(toView.view)

    UIView.animate(withDuration: duration, delay: 0.0, usingSpringWithDamping: 0.8, initialSpringVelocity: 0.8, options: [], animations: {
        toView.view.transform = screenOffUp
    }, completion: { (success) in
        transitionContext.completeTransition(success)
    })
}

func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
    return duration
}
}

解雇逻辑

class CustomActionSheetDismissalTransition: NSObject, UIViewControllerAnimatedTransitioning {
private let duration = 0.8

func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
    return duration
}

func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
    guard let fromView = transitionContext.viewController(forKey: .from) else { return }
    let screenOffDown = CGAffineTransform(translationX: 0, y: fromView.view.frame.height)

    UIView.animate(withDuration: duration, delay: 0.0, usingSpringWithDamping: 0.8, initialSpringVelocity: 0.8, options: [], animations: {
        fromView.view.transform = screenOffDown
    }, completion: { (success) in
        transitionContext.completeTransition(success)
    })
}

}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接