問題
私のiPadアプリでは、押し続けるイベントの後でのみ、ボタンバーアイテムにポップオーバーをアタッチできません。しかし、これは元に/やり直しの標準のようです。他のアプリはこれをどのように行いますか?
バックグラウンド
UIKit(iPad)アプリのツールバーに元に戻すボタン(UIBarButtonSystemItemUndo)があります。元に戻すボタンを押すと、元に戻すアクションが実行され、正しく実行されます。
ただし、iPadでの元に戻す/やり直しの「標準のUE規則」では、元に戻すを押すと元になりが実行されますが、ボタンを押し続けると、コントローラーが閉じられるまでユーザーが「元に戻す」または「やり直し」のいずれかを選択したポップオーバーコントローラーが表示されます。
ポップオーバーコントローラーを接続する通常の方法は、presentPopoverFromBarButtonItem:を使用することです。これは、簡単に構成できます。これを長押しした後にのみ表示するには、次のスニペットのように「長押し」ジェスチャイベントに応答するビューを設定する必要があります。
UILongPressGestureRecognizer *longPressOnUndoGesture = [[UILongPressGestureRecognizer alloc]
initWithTarget:self
action:@selector(handleLongPressOnUndoGesture:)];
//Broken because there is no customView in a UIBarButtonSystemItemUndo item
[self.undoButtonItem.customView addGestureRecognizer:longPressOnUndoGesture];
[longPressOnUndoGesture release];
これにより、ビューを長押しした後、メソッドhandleLongPressOnUndoGesture:が呼び出され、このメソッド内で、元に戻す/やり直しのポップオーバーを構成して表示します。ここまでは順調ですね。
これに伴う問題は、アタッチするビューがないことです。self.undoButtonItemはUIButtonBarItemであり、ビューではありません。
可能な解決策
1)[理想]ボタンバーアイテムにジェスチャレコグナイザーを取り付けます。ビューにジェスチャレコグナイザーをアタッチすることは可能ですが、UIButtonBarItemはビューではありません。.customViewのプロパティはありますが、buttonbaritemが標準のシステムタイプ(この場合はそうです)の場合、そのプロパティはnilです。
2)別のビューを使用します。UIToolbarを使用することもできますが、そもそも可能であれば、奇妙なヒットテストが必要であり、万能のハックになるでしょう。私が考えることができる他の使用する代替ビューはありません。
3)customViewプロパティを使用します。UIBarButtonSystemItemUndoのような標準タイプにはcustomViewがありません(nilです)。customViewを設定すると、必要な標準コンテンツが消去されます。これは、可能であれば、UIBarButtonSystemItemUndoのすべての外観と関数を再実装することになります。
質問
この「ボタン」にジェスチャレコグナイザーをアタッチするにはどうすればよいですか?具体的には、iPadアプリに標準の長押しして表示をやり直すポップオーバーを実装するにはどうすればよいですか?
アイデア?特に誰かが実際にアプリでこれを動作させていて(私はあなたのことを考えています、オムニ)、共有したい場合は特にありがとうございます...