ポップオーバーからUIActionSheetを表示しようとしているときに誰もがこのメッセージを受け取っていますか?
アプリケーションはUIAlertControllerStyleActionSheetスタイルのUIAlertController()を提示しました。このスタイルのUIAlertControllerのmodalPresentationStyleはUIModalPresentationPopoverです。アラートコントローラーのpopoverPresentationControllerを介してこのポップオーバーの位置情報を提供する必要があります。sourceViewおよびsourceRectまたはbarButtonItem。アラートコントローラーを提示したときにこの情報が不明な場合は、UIPopoverPresentationControllerDelegateメソッド-prepareForPopoverPresentationで提供できます。
以前、GM UIActionSheetをUIAlertControllerに変換するための回避策を使用し、これは正常に機能しています。ただし、AppleはUIActionSheetの問題を解決しようとしました。回避策を使いたくありませんでしたが、選択の余地がないようです...
IPadをサポートするには、次のコードを含めます。
alertView.popoverPresentationController?.sourceView = self.view
alertView.popoverPresentationController?.sourceRect = self.view.bounds
// this is the center of the screen currently but it can be any point in the view
self.presentViewController(alertView, animated: true, completion: nil)
ユーザーがUITableView
内のセルを選択した後にアクションシートを表示する場合。私はこれがうまく機能していることがわかりました:
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Directions"
message:@"Select mode of transportation:"
preferredStyle:UIAlertControllerStyleActionSheet];
alert.popoverPresentationController.sourceView = cell;
alert.popoverPresentationController.sourceRect = cell.bounds;
UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil];
//...
[self presentViewController:alert animated:YES completion:nil];
IPadサポートにはpopoverPresentationController
を提供する必要があります。ここでは、barButtonItem
またはsourceView
のいずれかを指定します。この別のスレッドはあなたを助けるかもしれません: Swift UIAlertController-ActionSheet iPad iOS8 Crashes
実際のところ、iPhoneおよびiPad向けXcodeの設計では、現時点ではバグがあります(私は信じています)。
alert.popoverPresentationController.sourceView = self.view; alert.popoverPresentationController.sourceRect = CGRectMake(self.view.bounds.size.width / 2.0 - 105, self.view.bounds.size.height / 2.0 + 70, 1.0, 1.0);
105および70でアラートボックスの位置を定義する必要があります。これは、アンカーポイントが異なるため、iPadポートレートデザインの寸法の大まかな違いです。UIAlertController
に「モーダルビュー」が付属していますが、残念ながらiPadで同じコードを使用する場合、「モーダルビュー」にはなりません。つまり、iPadデザインでタッチを無効にするには、追加のコードを記述する必要があります。変だと思う。これらは私が見る奇妙なものです。規格がなければならないと思いますし、誰かが規格を外に出したいなら、他の選択肢もあると思います。
UIAlertControllerはiOS8のみであり、iOS7をサポートする必要があるため、使用しています。 iPadのマスター/詳細レイアウトのマスタービューでこれに遭遇しました。 [actionSheet showInView:]を使用して、親UISplitViewControllerからUIActionSheetを上げることで、これを回避できました(正確に修正することはできませんでした)。がんばろう。
IPadおよび通常iPhoneで矢印なしで中央に表示する場合:[Swift 3 +]:
if let popoverController = alertController.popoverPresentationController {
popoverController.sourceView = self.view
popoverController.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0)
popoverController.permittedArrowDirections = []
}
self.present(alertController, animated: true, completion: nil)