5

この次のスクリーンショットでは、「Available Kiosks」から「v」をクリックすると、戻るボタンのアクションが起動します...(2番目の「a」ではありません)。

代替テキスト

理由がわかりません。コードに特別なことは何もありません(これは、ナビゲーションコントローラーによって処理されるデフォルトの戻るボタンです)。他のアプリケーションでも同じバグがありますが、他のアプリケーションではこれに気づきません。

何か案は ?

ありがとうございました。

4

2 に答える 2

8

これはバグではありません。Apple アプリや、いくつかの (多く/すべての?) ボタンでも同じことが起こります。これは、ボタンのタッチ イベントの動作です。タッチの領域は、ボタンの境界よりも大きくなります。

于 2011-08-10T23:48:16.020 に答える
1

私は同じことをする必要があったので、元のメソッドを呼び出す前に UINavigationBar touchesBegan:withEvent メソッドをスウィズルし、タッチの y 座標をチェックすることになりました。
これは、ナビゲーションの下で使用していたボタンにタッチが近すぎると、キャンセルできることを意味します。

例: 戻るボタンは、ほとんどの場合、「最初の」ボタンではなく、タッチ イベントをキャプチャします。 ここに画像の説明を入力

ここに私のカテゴリーがあります:

@implementation UINavigationBar (UINavigationBarCategory)
- (void)sTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
float maxY = 0;
for (UITouch *touch in touches) {
    float touchY = [touch locationInView:self].y;
    if ( [touch locationInView:self].y > maxY) maxY = touchY;
}

NSLog(@"swizzlelichious bar touchY %f", maxY);

if (maxY < 35 )
    [self sTouchesEnded:touches withEvent:event];
else 
    [self touchesCancelled:touches withEvent:event];
}
- (void)sTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
float maxY = 0;
for (UITouch *touch in touches) {
    float touchY = [touch locationInView:self].y;
    if ( [touch locationInView:self].y > maxY) maxY = touchY;
}

NSLog(@"swizzlelichious bar touchY %f", maxY);

if (maxY < 35 )
    [self sTouchesBegan:touches withEvent:event];
else 
    [self touchesCancelled:touches withEvent:event];
}

CocoaDevの Mike Ash によるスウィズルの実装

void Swizzle(Class c, SEL orig, SEL new)
{
Method origMethod = class_getInstanceMethod(c, orig);
Method newMethod = class_getInstanceMethod(c, new);
if(class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod)))
    class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
else
    method_exchangeImplementations(origMethod, newMethod);
}

そして、関数はswizzle関数を呼び出します

Swizzle([UINavigationBar class], @selector(touchesEnded:withEvent:), @selector(sTouchesEnded:withEvent:));
Swizzle([UINavigationBar class], @selector(touchesBegan:withEvent:), @selector(sTouchesBegan:withEvent:));

Apple がこれに同意しているかどうかはわかりません。Apple の UI ガイドラインに違反している可能性があります。アプリをアプリ ストアに提出した後、投稿を更新しようとします。

于 2012-04-05T13:21:59.440 に答える