11

UIMenuController の新しいカスタマイズ機能を使用して、「コピー」以外のものをメニューに追加し、Web ビューにカット アンド ペーストします。

私がしていることは、共有 UIMenuController への参照を取得し、UIMenuItems の NSArray を menuItems に設定することです。1 つの項目を追加する限り、すべてが正常に機能します。たとえば、[COPY|FOOBAR] が表示されます。

代わりに、複数のアイテムを追加しようとすると、[COPY|MORE] が表示されます。MORE を押すと、最終的に他のアイテムが表示されます。

代わりに [COPY|FOO|BAR|THREE|FOUR] を直接表示することは可能ですか? これを実行できるアプリケーション、特に iBooks をいくつか見ました。

どんな助けでも非常に感謝しています、ありがとう。

乾杯、シッセンシオ

4

4 に答える 4

15

FluXaの答えは実際には正しいですが、あまり明確ではなかったと思います.

問題は、カスタム UIMenuItem オブジェクトを共有メニュー コントローラー ([UIMenuController sharedMenuController]) に追加すると、最初のカスタム UIMenuItem のみがメニューの最初の表示に表示されることです。ユーザーが「More...」をタップすると、残りのカスタム メニュー項目が表示されます。

ただし、メニューに組み込みのシステム メニュー項目 (copy:、paste: など) が含まれていない場合、最初のメニュー表示にはすべてのカスタム メニュー項目が表示され、"More..." 項目は表示されません。

組み込みのシステム アイテムを含める必要がある場合は、タイトルは同じでセレクターが異なるカスタム UIMenuItem を追加するだけです。( myCopy: 対 copy: )

基本的に、canPerformAction:withSender: のデフォルトの実装を呼び出さず、すべてのカスタム メニュー項目を明示的に処理し、他のすべての (システム提供の) メニュー項目に対して NO を返します。

- (BOOL) canPerformAction:(SEL)action withSender:(id)sender
{
    if ( action == @selector( onCommand1: ) )
    {
        // logic for showing/hiding command1
        BOOL show = ...;
        return show;
    }

    if ( action == @selector( onCommand2: ) )
    {
        // logic for showing/hiding command2
        BOOL show = ...;
        return show;
    }

    if ( action == @selector( onCopy: ) )
    {
        // always show our custom "copy" command
        return YES;
    }   

    return NO;
}
于 2011-01-05T19:55:34.947 に答える
4

iPadでアプリケーションを開発しようとしたときに、実際に同じ問題が発生しました。しかし、私がしたことは、ポップアップメニュー項目を無効にしたことです

  • (BOOL)canPerformAction:(SEL)action withSender:(id)sender

使用する

if ( [UIMenuController sharedMenuController] ) { [UIMenuController sharedMenuController].menuVisible = NO; いいえを返します。

次に、UIPopoverController を使用しました。

よろしく、 ZaldzBugz

于 2010-07-21T03:03:46.130 に答える
2

同じ問題に遭遇し、私がしたことは、webview をサブクラスでオーバーライドし (そうすべきではないことを知っています)、copy: セレクターの canPerformAction: に対して NO を返すことでした。次に、独自の Copy 項目を、UIWebview から元のメソッドを呼び出す ShareMenuController に追加しました。そうすれば、必要な数のアイテムを追加して、最初に表示することができます。

于 2010-08-22T12:35:34.990 に答える
0

menuFrame (読み取り専用プロパティ) を使用して、以前に表示された UIMenuController の rect を取得できます。これを使用して、同じ場所に表示される別の UIMenuController の位置を計算できます。

2 番目の UIMenuController を表示しようとしているアクション メソッドで、前の UIMenuController のフレームを取得します。

ここに画像の説明を入力

CGRect previousRect = [[UIMenuController sharedMenuController] menuFrame];

CGRect newRect = CGRectMake(previousRect.origin.x + previousRect.size.width/2,   previousRect.origin.y + previousRect.size.height, 0, 0);

大まかに矢印の位置を取得します。2 番目の UIMenuController を表示します

UIMenuItem *testMenuItem1 = [[UIMenuItem alloc] initWithTitle:@"test1" action:@selector(test1ItemClicked)];
UIMenuItem *testMenuItem2 = [[UIMenuItem alloc] initWithTitle:@"test2" action:@selector(test2ItemClicked)];


[[UIMenuController sharedMenuController] setMenuItems:@[testMenuItem1,testMenuItem2]];

UIMenuController *menuController = [UIMenuController sharedMenuController];

[menuController setTargetRect:newRect inView:_readerWebView];

[menuController setMenuVisible:YES animated:YES];

ここに画像の説明を入力

UIMenuController はシングルトンであるため、前の menuItems を表示したい場合は、再度それらを設定する必要があります。

于 2014-01-30T11:52:37.913 に答える