web-dev-qa-db-ja.com

iOS8を使用したPopoverのUIActionSheet GM

ポップオーバーからUIActionSheetを表示しようとしているときに誰もがこのメッセージを受け取っていますか?

アプリケーションはUIAlertControllerStyleActionSheetスタイルのUIAlertController()を提示しました。このスタイルのUIAlertControllerのmodalPresentationStyleはUIModalPresentationPopoverです。アラートコントローラーのpopoverPresentationControllerを介してこのポップオーバーの位置情報を提供する必要があります。sourceViewおよびsourceRectまたはbarButtonItem。アラートコントローラーを提示したときにこの情報が不明な場合は、UIPopoverPresentationControllerDelegateメソッド-prepareForPopoverPresentationで提供できます。

以前、GM UIActionSheetをUIAlertControllerに変換するための回避策を使用し、これは正常に機能しています。ただし、AppleはUIActionSheetの問題を解決しようとしました。回避策を使いたくありませんでしたが、選択の余地がないようです...

46
Tomer Peled

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)
103
Philip Jang

ユーザーが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];
11
Stunner

IPadサポートにはpopoverPresentationControllerを提供する必要があります。ここでは、barButtonItemまたはsourceViewのいずれかを指定します。この別のスレッドはあなたを助けるかもしれません: Swift UIAlertController-ActionSheet iPad iOS8 Crashes

7
Angel Jonathan

実際のところ、iPhoneおよびiPad向けXcodeの設計では、現時点ではバグがあります(私は信じています)。

  1. IPhoneでも同じコードが完璧に機能し、同じ位置(常に)で警告メッセージを見ることができます。ただし、iPadの場合、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ポートレートデザインの寸法の大まかな違いです。
  2. IPhoneデザインではUIAlertControllerに「モーダルビュー」が付属していますが、残念ながらiPadで同じコードを使用する場合、「モーダルビュー」にはなりません。つまり、iPadデザインでタッチを無効にするには、追加のコードを記述する必要があります。変だと思う。
  3. IPadの設計では、アンカーポイントが異なることを考慮する必要があります。 AlertViewの左上ではなく、バブルの三角形のポイントです。

これらは私が見る奇妙なものです。規格がなければならないと思いますし、誰かが規格を外に出したいなら、他の選択肢もあると思います。

2
icould

UIAlertControllerはiOS8のみであり、iOS7をサポートする必要があるため、使用しています。 iPadのマスター/詳細レイアウトのマスタービューでこれに遭遇しました。 [actionSheet showInView:]を使用して、親UISplitViewControllerからUIActionSheetを上げることで、これを回避できました(正確に修正することはできませんでした)。がんばろう。

1
Adam Jack

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)
0
Mohit Singh