こんにちは、IPhone SDK3.x でカット/コピー/ペースト メニューのようなカスタマイズ バブル メニューを作成したいと考えています。UIMenuController であることは知っていますが、標準の切り取り/コピー/貼り付けメニューしか提供していません。このようなバブル メニューを作成する方法は誰でも知っています。参照用の例とコードはありますか?
2 に答える
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 を検出するロジックを実装する必要があります。
UIMenuController で menuItems プロパティを使用します。