40

iPhoneアプリにUIPopOverControllerを使用する必要があります。stackoverflowを検索しました。誰かがUIPopoverControllerがiphoneiphoneデバイスで実行されないと言ったのはなぜですか。iphoneデバイスで実行するとこのエラーが発生します。 reason: '-[UIPopoverController initWithContentViewController:] called when not running under UIUserInterfaceIdiomPad.'

 -(void)btnSetRemainderTapped:(UIButton *)button
{
   setReminderView =[[SetRemainderView alloc]initWithNibName:@"SetRemainderView" bundle:[NSBundle mainBundle]];
setReminderView.contentSizeForViewInPopover = CGSizeMake(setReminderView.view.frame.size.width, setReminderView.view.frame.size.height);
setReminderView.delegate = self;
popOverController = [[UIPopoverController alloc]
                      initWithContentViewController:setReminderView] ;
 CGRect rect = CGRectMake(self.view.frame.size.width/2, self.view.frame.size.height/2, 1, 1);
[popOverController presentPopoverFromRect:rect
                                        inView:self.view
                      permittedArrowDirections:UIPopoverArrowDirectionAny
                                      animated:YES];
}

誰かが私を助けることができますか?

4

8 に答える 8

65

iPhoneアプリでpopoverControllerを使用できます。

1.カテゴリを作成します

// UIPopoverController+iPhone.h file
@interface UIPopoverController (iPhone)
+ (BOOL)_popoversDisabled;
@end

// UIPopoverController+iPhone.m file
@implementation UIPopoverController (iPhone)
+ (BOOL)_popoversDisabled {
    return NO; 
} 
@end

2.それをクラスにインポートし、通常どおりiPhoneでポップオーバーを使用します。

ただし、これはプライベートな方法であり、Appleはアプリを拒否できることを忘れないでください。しかし、私はこれを普通に使用している人々を知っており、Appleは彼らのアプリを公開しました。

于 2013-02-15T13:12:33.627 に答える
44

編集:Sobermanが述べたように、iOS 8以降、パブリックAPIを使用してiPhoneでポップオーバーを表示できるため、この回答はおそらくもう関係ありません。


UIPopoverControllerに関するAppleのドキュメントに記載されているように:

ポップオーバーコントローラーは、iPadデバイス専用です。

したがって、残念ながらiPhoneアプリケーションでこのクラスを使用する方法はありません。ただし、iPhoneサポートなどを追加するUIPopoverControllerによって提供される機能のカスタムサードパーティ実装がいくつかあります。たとえば、https://github.com/50pixels/FPPopoverを参照してください。

編集:チェックする価値のあるiPhone / iPadの両方のための別の高度にカスタマイズ可能なポップオーバー実装もあります:https ://github.com/nicolaschengdev/WYPopoverController 。

于 2013-02-09T14:16:11.053 に答える
30

iOS8以降、ポップオーバーを作成できるようになりました。これは、iPhoneでもiPadでも同じです。これは、ユニバーサルアプリを作成する人にとって特に素晴らしいので、個別のビューやコードを作成する必要はありません。

ここでクラスとデモプロジェクトを取得できます:https ://github.com/soberman/ARSPopover

あなたがする必要があるのは、サブクラスであり、プロトコルUIViewControllerに準拠し、値とともに必要なセットを設定することです。UIPopoverPresentationControllerDelegatemodalPresentationStyledelegate

// This is your CustomPopoverController.m

@interface CustomPopoverController () <UIPopoverPresentationControllerDelegate>

@end

@implementation CustomPopoverController.m

- (instancetype)init {
    if (self = [super init]) {
        self.modalPresentationStyle = UIModalPresentationPopover;
        self.popoverPresentationController.delegate = self;
    }
    return self;
}

- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller {
    return UIModalPresentationNone; //You have to specify this particular value in order to make it work on iPhone.
}

sourceViewその後、表示するメソッドで新しく作成したサブクラスをインスタンス化し、さらに2つの値をとに割り当てますsourceRect。次のようになります。

CustomPopoverController *popoverController = [[CustomPopoverController alloc] init];
popoverController.popoverPresentationController.sourceView = sourceView; //The view containing the anchor rectangle for the popover.
popoverController.popoverPresentationController.sourceRect = CGRectMake(384, 40, 0, 0); //The rectangle in the specified view in which to anchor the popover.
[self presentViewController:popoverController animated:YES completion:nil];

そして、あなたはそれを持っています、素敵で、きちんとしたぼやけたポップオーバー。

于 2015-05-23T22:32:06.530 に答える
14

したがって、@ Sobermansの回答では、最初から最後まで問題が実際に解決されなかったので、ドキュメントを使用してどのように解決したかを詳しく説明したいと思います。そうは言っても、私は独自のプレゼンテーションコントローラーサブクラスを使用して、表示したいすべてのカスタマイズを管理するというアイデアが好きです。

1.提示するコントローラーを作成します

最初のステップは、提示するコントローラーをインスタンス化することです。

let vc: UIViewController = ...
vc.modalPresentationStyle = .Popover
vc.preferredContentSize = CGSize(width: CGRectGetWidth(view.bounds)/2, height: 100)

これで、ポップオーバーのプレゼンテーションスタイルと任意のコンテンツサイズのコントローラーができました。

2.実装adaptivePresentationStyleForPresentationController

デフォルトUIPopoverPresentationControllerではiPhoneの全画面表示になるため、この動作を防ぐには、アダプティブプレゼンテーションスタイルを強制的になしにする必要があります。

まず、ポップオーバープレゼンテーションコントローラーのデリゲートを設定します

vc.popoverPresentationController.delegate = self;

次に、実装しますUIPopoverPresentationControllerDelegate

func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
    return .None;
}

3.ポップアップを表示して構成します

最初に呼び出す必要がありpresentViewController、その後でのみポップオーバーを構成できます。

presentViewController(vc, animated:true, completion:nil)
if let popover = vc.popoverPresentationController {
    popover.permittedArrowDirections = .Right | .Left
    popover.sourceView = button
    popover.sourceRect = button.bounds
}
于 2015-09-08T08:04:34.743 に答える
3

次のようなカスタムポップオーバーコントローラーを使用します。

https://github.com/sammcewan/WYPopoverController

(これは私が見つけた中で最もサポートされているもののようです)。

于 2014-09-18T00:02:16.127 に答える
1

最終的にカスタムツールチップ/ポップオーバークラスを作成しました。

任意のコンテンツビューで初期化でき、フレームを動的に調整します。

それが役に立てば幸い。

https://github.com/akeara/AKETooltip

于 2015-02-08T11:00:30.610 に答える
0

Swiftでそれを実行したい場合、コードは次のようになります。

extension UIPopoverController {
    class var _popoversDisabled : Bool {
    get { return false }
    }
}

編集:iOs7.1を搭載したiPhoneのXcode6ベータ4で動作しています

于 2014-07-31T13:39:14.097 に答える
0

これは本当に興味深い(そして気のめいる)スレッドです。AppleがiPhoneでのポップアップダイアログを阻止しているなんて信じられない。理由はまったくない。

そして、確かに、iOS 8では、この制限を回避しようとすると、ポップアップがフルスクリーンのモーダルダイアログとして表示されます。

次の優れたWebページでは、独自のiBooksとiTunesアプリが独自のルールを破り、ポップアップを許可する「Apple Cheats」について説明していますが、独自のiPhoneアプリ内からのみです。

HowAppleCheats

読んでください(警告:AppleとXCodeをさらに嫌うでしょう..)

iOS 8 で「 UIUserInterfaceIdiomPadで実行されていないときに呼び出されるUIPopoverController 」エラーを回避したいですか?

単純。

.plistファイルに移動し、バンドルIDを「com.apple.itunesu」に変更するだけで、XCodeにアプリが実際にiTunesであると認識させることができます。

その後、ポップアップは正常に機能します。

ここに画像の説明を入力してください

(はぁ。)

これを行う別の方法はUIViewController、画面に直接追加することです。

現れる

この例では、iPhone画面の上に「ヘルパー画面」を表示したいと思いました。これUIViewControllerは、独自の.xibファイルに保存されており、きれいな境界線を追加するための数行があります。

- (void)viewDidLoad {
    [super viewDidLoad];
    // Give our popup a pretty curved border
    self.view.layer.borderColor = [[UIColor blueColor] CGColor];
    self.view.layer.borderWidth = 1.0;
    self.view.layer.cornerRadius = 8;    
}

これを表示するには、このインスタンスを作成UIViewControllerし、画面に追加してから、中央に配置します。

-(void)showHelperScreen
{
    if (self.helperScreen == nil)
    {
        //  Add the popup UIViewController to our screen
        self.helperScreen = [[HelperViewController alloc] init];
        [self.view addSubview:self.helperScreen.view];
    }

    //  Center the popup in the middle of the screen
    CGSize screenSize = [[UIScreen mainScreen] applicationFrame].size;
    self.helperScreen.view.center = CGPointMake(screenSize.width/2, screenSize.height/2);
}

もちろん、ユーザーがポップアップの外側をタップしたときにポップアップが消えるようにコードを追加する必要もありましたが、これは少なくとも、アプリ特に呼び出されていなくても、iPhoneでポップアップを(安全に)表示できることを示していますiTunesまたはiBook。

出来上がり。

これがお役に立てば幸いです。誰かが私を必要としている場合は、安全で幸せな場所(つまり、Visual Studio)に戻ります。

于 2015-02-05T10:35:30.303 に答える