2

私は奇妙な問題に陥っています。タッチ時にキーのハイライトを描画する必要があるキーボード拡張機能を作成しています。私はそれをうまく行うことができますが、奇妙なことに、左上隅のいくつかのキー、特にキーQAでは、毎回ハイライトを描画しません。主に私のコードは次のようになります..

  1. オンtouchbegan- 呼び出してハイライトを描画[keysLayer setNeedsDisplay];
  2. オンtouchEnd- もう一度呼び出してハイライトを削除します[keysLayer setNeedsDisplay];

したがって、基本的に、drawRect関数はこれらの特定のキーで毎回呼び出されるわけではなく、他のすべてが正常に機能し、呼び出されることさえありsetNeedsDisplayます。

だから、私は助けを探しています.drawRect関数の呼び出しに失敗する可能性があります.理由のリストを知りたいです.

誰かが私を助けることができれば。

アップデート


コードの追加

KeysLayer ビューが追加された SuperView 内。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];

    keysLayer.drawHighlight=YES;
    keysLayer.touchLocation=[touch locationInView:self];
    [keysLayer setNeedsDisplay];
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesEnded:touches withEvent:event];

    keysLayer.drawHighlight=NO;
    [keysLayer setNeedsDisplay];
}

KeysLayer UIView クラス

- (void)setTouchLocation:(CGPoint)location{
    self.touchLocation=location;

    bezierPathForHighlight=[self createHighLightPath];//Creating simple path based on touch location.
}

- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);

    if(!self.drawHighlight)
       [bezierPathForHighlight removeAllPoints];

    [bezierPathForHighlight stroke];
    CGContextRestoreGState(context);

}

更新 2


そのため、 iOS9.0を搭載したiPhone6でのみ発生する問題を発見しました。このテスト アプリケーションでこれを検証します。このテスト アプリケーションで驚くべきことに、iOS がdrawRectiOS バグと呼ばない特定のタッチ領域があることがわかりました。

下の添付画像を参照してください。実際に発生する場所を説明しています。解決策のない問題があります。助けが必要。

ここに画像の説明を入力

ありがとう。

4

1 に答える 1

4

iOS 9問題は以降に固有のようです。他のデバイスでも複製できます。問題はUIWindowジェスチャー認識にあるようです。(@iphonic) サンプル コードを確認しているときに、その特定の場所を 1 秒間タップ アンド ホールドすると、drawRect が呼び出されることがわかりました :)。delay in touchesですから、それらの場所にあるように思えました。

そこで、さまざまな場所のタッチのデバッグを開始し、プライベート クラスがこれらの領域で異なるプロパティを持っていることを発見し_UISystemGestureGateGestureRecognizerました。UIWindowdelaysTouchesBeganNO

問題は解決しました。実際には、問題はその特定の領域に固有のものではなく、画面の左隅にApple何らかの実装が行われている可能性があります。現在は正常に動作していますが。私は観察を続けますが、当分の間、それはあなたにとって有効な修正です。

追加する必要がある小さなサンプル コードを次に示します。

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];

    for (UIGestureRecognizer *gesture in self.view.window.gestureRecognizers) {
        gesture.delaysTouchesBegan = NO;
    }
}

ビューが表示された後に、このコードを追加しますUIViewController

于 2015-10-12T09:45:01.563 に答える