2

Apple のキーボードと同様に機能するカスタム キーボードの作成に成功しました。変わらないことが 1 つあります。Apple の iPhone キーボードでは、ユーザーがキーボード上で指をスワイプすると、通過したすべてのキーがポップアップ表示されます。私のキーボードでは、これは起こりません。指を横にスワイプすると、最初に触れたボタンがポップアップ表示され、十分に離れると元に戻ります。私は現在、ポップアップキーにこのコードを使用しています:

UIImage *bigLetter = [UIImage imageNamed:@"letter1.png"];
[keyOne setImage:bigLetter forState:UIControlStateHighlighted];

keyOne は UIButton であり、ユーザーがキーボードのキーを「強調表示」またはタップすると、大きな文字の画像がオーバーレイされます。ユーザーが Q キーを強調表示し、W キーに指をスライドさせると W キーが強調表示されるように、「ホバー」するだけの同様の状態はありますか?

4

3 に答える 3

6

私は自分のアプリである化合物に周期表キーボードを実装しました。

UIButton を使用しないでください。

キーボードを表示するには、UIViews または CALayers を使用して個々のキーを表示します。

また

静的 PNG。メモリと「ジッパー」がはるかに簡単です。(これは、まだ来ていない更新のために行ったことです)

親ビューを使用してすべてのタッチを追跡する必要があります。(これがなぜそうであるかを説明するために、下部に小さな脇を追加) touches メソッドを次のように実装します。

- (void)touchesBegan: (NSSet *)touches 
           withEvent: (UIEvent *)event {
    NSLog(@"TouchDown");

    CGPoint currentLocation = [[touches anyObject] locationInView:self.view];
    [self magnifyKey:[self keyAtPoint:currentLocation]];
}

-(void)touchesMoved: (NSSet *)touches 
          withEvent: (UIEvent *)event {
    NSLog(@"TouchMoved");

    CGPoint currentLocation = [[touches anyObject] locationInView:self.view];
    [self magnifyKey:[self keyAtPoint:currentLocation]];    
}


-(void) touchesEnded: (NSSet *)touches 
           withEvent: (UIEvent *)event{

    NSLog(@"TouchUp");

    CGPoint currentLocation = [[touches anyObject] locationInView:self.view];

    int key = [self keyAtPoint:currentLocation];
    [self selectKey:aKey];
}

これらのメソッドはキーを取得し、選択したキーを適切に「拡大」します。

CGRects の配列に対してポイントを実行して、キーが押されたかどうかを判断します (これは、ヒット テストに比べて高速です)。

- (int)keyAtPoint:(CGPoint)aPoint{

    int aKey=1;
    for(NSString *aRect in keys){
        if(CGRectContainsPoint(CGRectFromString(aRect), aPoint)){
            break;
        }
        aKey++;
    }

    if(aKey==kKeyOutOfBounds)
        aKey=0;
    NSLog([NSString stringWithFormat:@"%i",aKey]); 
    return aKey;
}


- (void)magnifyKey:(int)aKey{

        if(aKey!=0) {

            if(magnifiedKey==nil){

                self.magnifiedKey = [[[MagnifiedKeyController alloc] initWithKey:aKey] autorelease];
                [self.view addSubview:magnifiedKey.view];       

            }else{

                [magnifiedKey setKey:aKey];
                if([magnifiedKey.view superview]==nil)
                    [self.view addSubview: magnifiedKey.view];      

            }

        }else{

            if(magnifiedKey!=nil)
                [magnifiedKey.view removeFromSuperview];
        }
    }


    - (void)selectKey:(int)aKey{

        if(magnifiedKey!=nil){

            if(aKey!=0){

                [magnifiedKey flash];
                [self addCharacterWithKey:aKey];
            }
            [magnifiedKey.view performSelector:@selector(removeFromSuperview) withObject:nil afterDelay:0.5];
        }
    }

実装するメソッドがいくつかありますが、非常に簡単です。基本的に拡大キーであるビューを作成しています。次に、ユーザーが指をスライドさせて移動します。


余談:

タッチがビューによって追跡されると、touchesEnded: (または touchesCancelled:) が呼び出されるまでタッチを追跡し続けるため、サブビューでタッチを追跡することはできません。これは、文字「Q」がタッチを追跡すると、他のキーがそのタッチにアクセスできないことを意味します。文字「W」の上にカーソルを置いていても。これは他の場所で有利に使用できる動作ですが、この状況では、タッチを追跡する役割を持つ「親ビュー」を使用して回避する必要があります。


(メモリリークを修正するために更新)

于 2009-07-29T06:27:28.090 に答える
0

UIControlEvents 列挙を見てください。これは、特定のビューでキャッチできるすべてのイベントです。

推測する必要がある場合は、TouchDown と TouchDrag シリーズの組み合わせを使用して、おそらくこの機能を複製できると思います。TouchUp を使用して、タッチされたキーをキャッチします。

于 2009-07-28T16:59:41.630 に答える
0

コンテナ UIView の touchesMoved:withEvent: メソッドを使用して、次のような各サブビュー (別名、キー) のヒット テストを実行できます。

for(key in keys){
  location = [touch locationInView:key];
  if([key pointInside:location withEvent:event]){
    // if not already animated or otherwise triggered, trigger
  }
}

アイデアは、親ビューを使用してタッチ シーケンスを処理することです。これは、タッチが (UIControl *) サブビューの「ホット ゾーン」の外に移動したときに、シーケンスの終了を回避する簡単な方法です。

于 2009-07-28T20:30:38.367 に答える