带有延迟标题和消息的 actionSheet 样式警报

Alert with actionSheet style being shown with delayed title and message

自 iOS 13 起,我的带有 actionSheet 样式的警报显示 "delayed" 标题和消息。

这些是 Apple 的 release notes

我已经研究了很多,但找不到如何让它像 iOS 13.1 之前那样工作,其中标题和消息是在操作按钮的同时呈现的。

这是创建警报并显示它的方法:

    private func showRemoveConfirmationAlert() {
        let alert = UIAlertController(
            title: "Remove device?".localized(), 
            message: "Are sure you want to remove this device from your account?\nMake sure to unpair your device before removing it. This action cannot be undone.".localized(), 
            preferredStyle: .actionSheet
        )

        alert.addAction(UIAlertAction(title: "Remove".localized(), style: .destructive, handler: { _ in
            AnalyticsHelper.logRemoveDeviceConfirmedTapped()
            self.viewModel?.removeFromAccount()
        }))
        alert.addAction(UIAlertAction(title: "Cancel".localized(), style: .cancel, handler: { _ in
            AnalyticsHelper.logCancelTapped()
        }))

        if let popoverController = alert.popoverPresentationController {
            popoverController.sourceView = self.view
        }

        self.present(alert, animated: true)
    }

这是它的样子:

如有任何帮助,我们将不胜感激!提前致谢。

这是 iOS 13 之后的默认行为。如果你想立即渲染它,将动画更改为 false

self.present(alert, animated: false, completion : nil)

试试这个:

private func showRemoveConfirmationAlert() {

    DispatchQueue.main.async {
        let alert = UIAlertController(
            title: "Remove device?".localized(), 
            message: "Are sure you want to remove this device from your account?\nMake sure to unpair your device before removing it. This action cannot be undone.".localized(), 
            preferredStyle: .actionSheet
        )

        alert.addAction(UIAlertAction(title: "Remove".localized(), style: .destructive, handler: { _ in
            AnalyticsHelper.logRemoveDeviceConfirmedTapped()
            self.viewModel?.removeFromAccount()
        }))
        alert.addAction(UIAlertAction(title: "Cancel".localized(), style: .cancel, handler: { _ in
            AnalyticsHelper.logCancelTapped()
        }))

        if let popoverController = alert.popoverPresentationController {
            popoverController.sourceView = self.view
        }

        self.present(alert, animated: true)
    }
}

首先感谢各位的解答!

解决方案

经过大量调查和测试,我发现问题出在 Info.plist.

上的 Renders with edge antialiasing 属性中

在开发自定义按钮时,我在 Info.plist 文件的末尾添加了以下行,以检查它是否使按钮呈现效果更好。

    <key>UIViewEdgeAntialiasing</key>
    <true/>

它没有改进按钮渲染,但我忘了删除它。


调查

我找到问题的方法是创建一个全新的项目并开始添加有问题的部分项目。

在添加所有库并重新创建一些屏幕和行为但没有成功之后,我尝试比较项目设置,Info.plist 上的这个不同属性出现了。

此外,我在搜索属性时发现this related question。我之前可能没有看到它,因为它是 2013 年的,我认为它与自 iOS 13 于 2019 年 9 月发布以来的最新 iOS 更改有关,这让我过滤了所有较旧的结果。