13

我试图弄清楚如何在我的 iMessage 应用程序扩展中显示UIAlertController一个风格。UIAlertControllerStyleActionSheet

问题是,当调用时,操作表出现在原生 iMessage 文本字段下方:

[self.view.window.rootViewController presentViewController:actionSheetController animated:YES completion:NULL];

我将如何解决这个问题?

代码:

UIAlertController *actionSheetController = [UIAlertController alertControllerWithTitle:NSLocalizedString(@"Clear", nil) message:nil preferredStyle:UIAlertControllerStyleActionSheet];

UIAlertAction *clear = [UIAlertAction actionWithTitle:NSLocalizedString(@"Clear", nil) style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action)
{
    [self clear];
}];

UIAlertAction *cancel = [UIAlertAction actionWithTitle:NSLocalizedString(@"Cancel", nil) style:UIAlertActionStyleCancel handler:^(UIAlertAction *action)
{}];

[actionSheetController addAction:clear];
[actionSheetController addAction:cancel];

[self.view.window.rootViewController presentViewController:actionSheetController animated:YES completion:NULL];

在此处输入图像描述

4

4 回答 4

3

另一种解决方法:

actionSheetController.view.transform = CGAffineTransform(translationX: 0, y: -40)    
[self.view.window.rootViewController presentViewController:actionSheetController animated:YES completion:NULL];
于 2016-10-13T18:45:50.767 回答
3

这是一种解决方法。也许添加一点动画,使其流畅。

[self.view.window.rootViewController presentViewController:actionSheetController animated:YES completion:^{
    actionSheetController.view.frame = CGRectOffset(actionSheetController.view.frame, 0, -40);
}];
于 2016-10-07T15:15:52.820 回答
0

不要硬编码操作表的 y 位置。

当苹果更改 iMessage 扩展坞的高度时,这可能会导致后来的 iOS 主要更新出现 ui 问题。而是使用该safeAreaInsets.bottom值来找出视图被停靠栏隐藏的值。

这是我们正在使用的解决方案:

    let actionSheet = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)

    actionSheet.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: { (_) in
        actionSheet.dismiss(animated: true, completion: nil)
    }))

    // Adding further actions...

    present(actionSheet, animated: true) {
        UIView.animate(withDuration: 0.2, animations: {
            actionSheet.view.frame = CGRect(x: actionSheet.view.frame.minX,
                                            y: actionSheet.view.frame.minY - self.view.safeAreaInsets.bottom,
                                            width: actionSheet.view.frame.width,
                                            height: actionSheet.view.frame.height)
        })
    }

详细信息:操作表被 iMessage 停靠栏隐藏,因为您在其上呈现操作表的视图控制器视图被绑定到视图的底部,而不是 iMessage 停靠栏的顶部。必须考虑这种情况,例如在向其他视图及其子视图添加约束时。


更新:

只需使用以下代码以避免上面的动画。在我的情况下,看到动画后确实很烦人。

extension UIAlertController {
    open override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        guard let viewController = presentingViewController else { return }
        view.transform = .identity
        view.transform = .init(translationX: 0.0, y: - viewController.view.safeAreaInsets.bottom)
    }
}
于 2018-07-06T17:02:06.510 回答
-1

据此,您可以通过以下方式请求全屏演示:

[self requestPresentationStyle:MSMessagesAppPresentationStyleExpanded];

在您的代码之前:

[self.view.window.rootViewController presentViewController:actionSheetController animated:YES completion:NULL];
于 2016-10-07T17:48:46.327 回答