6

こんにちは、IPhone SDK3.x でカット/コピー/ペースト メニューのようなカスタマイズ バブル メニューを作成したいと考えています。UIMenuController であることは知っていますが、標準の切り取り/コピー/貼り付けメニューしか提供していません。このようなバブル メニューを作成する方法は誰でも知っています。参照用の例とコードはありますか?

4

2 に答える 2

39

1) カスタム メニュー項目を共有 UIMenuController に追加する必要があります。

UIMenuItem* miCustom1 = [[[UIMenuItem alloc] initWithTitle: @"Custom 1" action:@selector( onCustom1: )] autorelease];
UIMenuItem* miCustom2 = [[[UIMenuItem alloc] initWithTitle: @"Custom 2" action:@selector( onCustom2: )] autorelease];
UIMenuController* mc = [UIMenuController sharedMenuController];
mc.menuItems = [NSArray arrayWithObjects: miCustom1, miCustom2, nil];

2) メニューを表示するときにファーストレスポンダーとなるビューのレスポンダー チェーンのどこかにハンドラー メソッドを実装する必要があります。

- (void) onCustom1: (UIMenuController*) sender
{
}

- (void) onCustom2: (UIMenuController*) sender
{
}

3) 必要に応じて、メニューを表示するときにファーストレスポンダーになるビューのレスポンダー チェーンに canPerformAction: を実装する必要があります。

- (BOOL) canPerformAction:(SEL)action withSender:(id)sender
{
    if ( action == @selector( onCustom1: ) )
    {
            return YES; // logic here for context menu show/hide
    }

    if ( action == @selector( onCustom2: ) )
    {
            return NO;  // logic here for context menu show/hide
    }

    if ( action == @selector( copy: ) )
    {
             // turn off copy: if you like:
        return NO;
    }

    return [super canPerformAction: action withSender: sender];
}

4) メニューを表示するビューがまだメニューの表示をサポートしていない場合 (つまり、ユーザーがロングタップすると UIWebView はメニューを表示しますが、UILabel にはメニュー表示のサポートが組み込まれていません) )、メニューを自分で提示する必要があります。これは多くの場合、UILongPressGestureRecognizer をビューにアタッチし、コールバックでメニューを表示することによって行われます。

UILongPressGestureRecognizer* gr = [[[UILongPressGestureRecognizer alloc] initWithTarget: self action: @selector( onShowMenu: ) ] autorelease];
   [_myview addGestureRecognizer: gr];



- (void) onShowMenu: (UIGestureRecognizer*) sender
{
    [sender.view becomeFirstResponder];

    UIMenuController* mc = [UIMenuController sharedMenuController];

    CGRect bounds = sender.view.bounds;

    [mc setTargetRect: sender.view.frame inView: sender.view.superview];
    [mc setMenuVisible: YES animated: YES];
}

メニューを表示するには、firstResponder を要求するビューが必要であることに注意してください。

5) メニューを表示しているビューが canBecomeFirstResponder に YES/TRUE を返すことを確認します。たとえば、UILabel をファーストレスポンダにしようとすると、NO が返されるため、サブクラス化する必要があります。

6) それだけです。アクション コールバックが呼び出されたときに、ResignFirstResponder を使用したい場合がありますが、これを行うには、firstResponder を検出するロジックを実装する必要があります。

于 2010-11-02T16:36:30.927 に答える
-1

UIMenuController で menuItems プロパティを使用します。

于 2010-05-04T06:18:46.727 に答える