IPhoneとiPadの両方のレイアウトと互換性のあるアプリケーションがあります。 iPhoneレイアウトの場合、iPad用のアクションシートとポップオーバーを作成しました。問題は、ポップオーバーの矢印がクリックしたボタンを指していないことです。以下は私のコードです...
let actionSheet = UIAlertController(title: "Choose an option",
message: "Message",
preferredStyle: .ActionSheet)
...
if UIDevice.currentDevice().userInterfaceIdiom == UIUserInterfaceIdiom.Pad
{
// for iPad
actionSheet.popoverPresentationController?.sourceView = self.view
actionSheet.popoverPresentationController?.sourceRect = self.view.bounds;
actionSheet.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection.allZeros;
}
self.presentViewController(actionSheet, animated: true, completion: nil)
sourceView
とsourceRect
をbutton
とbutton.bounds
として設定します。
ビューのレイアウトに応じてallowedArrowDirectionsを選択できます。
actionSheet.popoverPresentationController?.sourceView = button
actionSheet.popoverPresentationController?.sourceRect = button.bounds;
actionSheet.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection.Left;
ボタンがBarButtonItemの場合、このコードを使用します。
actionSheet.popoverPresentationController?.barButtonItem = button
actionSheet.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection.Up;
私にとっては、送信者を使用してUIViewとしてキャストしました。
alertController.popoverPresentationController?.sourceView = sender as! UIView
alertController.popoverPresentationController?.sourceRect = sender.bounds
alertController.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection.Up
Swift
私のボタンがUIBarButtonItemの場合、これはうまくいきました:
if UIDevice.current.userInterfaceIdiom == .pad {
if controller.responds(to: "popoverPresentationController") {
controller.popoverPresentationController?.barButtonItem = YourUIBarButtonName
}
}
以下のコードスニペット全体:
func presentActivitySheet() {
let controller = UIActivityViewController(activityItems: [document.fileURL], applicationActivities: nil)
if UIDevice.current.userInterfaceIdiom == .pad {
if controller.responds(to: "popoverPresentationController") {
controller.popoverPresentationController?.barButtonItem = YourUIBarButtonName
}
}
present(controller, animated: true, completion: nil)
}