テキスト部分などをクリックした時に表示されるメニューをカスタマイズする方法を紹介します。

これですね。

UIViewのサブクラスで、UIMenuControllerを表示するメソッドを記述します。UIViewのサブクラス上というのが重要で、UIViewControllerのサブクラス上に実装しても動かないので注意してください。

- (void)showMenuControllerWithTargerRect:(CGRect)targetRect inView:(UIView *)view
{
    [self becomeFirstResponder];

    UIMenuController *menuController = [UIMenuController sharedMenuController];

    // 表示するメニュー
    UIMenuItem *copyItem = [[UIMenuItem alloc] initWithTitle:@"コピー" action:@selector(handleCopyMenuSelect:)];
    UIMenuItem *searchItem = [[UIMenuItem alloc] initWithTitle:@"検索" action:@selector(handleSearchMenuSelect:)];
    UIMenuItem *etcItem = [[UIMenuItem alloc] initWithTitle:@"その他" action:@selector(handleEtcMenuSelect:)];

    menuController.menuItems = @[copyItem, searchItem, etcItem];

    // 矢印の方向
    menuController.arrowDirection = UIMenuControllerArrowDown;

    // 表示する場所を指定して表示
    [menuController setTargetRect:targetRect inView:view];

    // いったん消して出す
    [menuController setMenuVisible:NO  animated:NO];
    [menuController setMenuVisible:YES animated:YES];
}

次に、canPerformAction:withSender メソッドを下記のとおりオーバーライドします。

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender 
{
    // メニューを表示する
    if (action == @selector(handleCopyMenuSelect:)) {
      return YES;
    }
    if (action == @selector(handleSearchMenuSelect:)) {
      return YES;
    }
    if (action == @selector(handleEtcMenuSelect:)) {
      return YES;
    }

    return NO;
}

そして、canBecomeFirstResponder メソッドを下記のとおりオーバーライドします。

- (BOOL)canBecomeFirstResponder
{
    return YES;
}

最後に、メニューをタップした時に実行されるメソッドを実装すればOKです。

これで、メニューが表示されるようになります。