1

Apple のドキュメントによると、タッチ可能なビューには、少なくとも 44 x 44 ポイントのタッチ可能な領域が必要です。

私はいくつかの調査を行いましたが、次のように pointInside を上書きするのが良い解決策のようです:

- (BOOL) pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    CGRect l_bounds = self.bounds;
    float lengthOf44 = [self convertLengthFromScreen:44];
    CGFloat l_widthDelta = lengthOf44 - l_bounds.size.width;
    CGFloat l_heightDelta = lengthOf44 - l_bounds.size.height;
    if (l_widthDelta < 0)
    {
        l_widthDelta = 0;
    }

    if (l_heightDelta < 0)
    {
        l_heightDelta = 0;
    }

    l_bounds = CGRectInset(l_bounds, -0.5 * l_widthDelta, -0.5 * l_heightDelta);

    if (CGRectContainsPoint(l_bounds, point))
    {
        return YES;
    }
    return NO;
}

ただし、このソリューションには多くの欠点があります。5 x 5 ピクセル サイズの小さなビューがあるとします。

  1. 小さいビューがスーパー ビューの端に非常に近いと仮定すると、このメソッドにより、タッチ可能な領域の半分がスーパービューの外側に拡張され、タッチ可能な領域は実際には 22 x 44 になります。その場合、スーパービューの pointInside をさらに上書きする必要があります。 .

  2. 互いに非常に近い 3 つの小さなビューがあるとします。この場合、常に上のビューが優先されます。理想的には、タッチ ポイントに最も近いビューが勝つようにしたいと考えています。

これよりも優れた、またはよりエレガントなソリューションはありますか?

私の懸念をよりよく説明するために、例を挙げましょう。誰もが iOS の Copy Blue Hint Dot に精通しているはずです (正しい言葉を使用しているかどうかはわかりませんが、画像を参照してください)。 http://i.stack.imgur.com/FtjYi.png

それを実装するとします (コピーの青い点)。この青い点については、Apple がどのように実装したかわかりません。ただし、青い点はUIImageViewの一種であり、UITextViewのサブビューであると想定しています(これは確かではないかもしれません)。そのUIImageViewはタッチに反応できますか?私のソリューションでは、pointInSide を上書きすることでタッチに応答できます。このコンテキストでの私の 2 つの質問は、次のように翻訳できます。

  1. 選択した単語が UITextView の端に近すぎる場合はどうなりますか? したがって、その青い点の理想的なタッチ領域は、スーパービュー (UITextView) の外側にある場合もあります。
  2. 上の青い点が下の青い点に近すぎて、2 つの点の中間点からドラッグした場合はどうなりますか (下の青い点の方が勝つ可能性が高いようです)。
4

2 に答える 2

1

You missed the point of the docs.

Apple UI guidelines suggest that you do not make touchable areas (which are usually represented by a view of some kind, button, image whatever) less than 44X44 for usability reasons. (the size of a fingertip)

If you have a view 5X5, its not the right view to receive touch events and you should use a super view of that view to receive the touch events for the child.

(edited to remove my incorrect statement that this is not possible)

于 2012-08-09T00:31:42.007 に答える
0

あなたは間違ったアプローチをとっています。まず、ios からのタッチ検出を台無しにしないでください。指のタッチで正しく機能するように事前に構成および最適化されています。 .

ある種の「ユーザーがどこに触れたか」をしたいようです。たとえば、私があなただったら、完全なタッチ可能領域である uiview を取得し、そこに残りの要素を追加するだけです。スーパービューがタッチを受け取るものであることを確認し、要素の中心に最も近いものを計算して確認してください。それらがボタンであっても、相互作用を無効にして、状態の変化をプログラムで表示できます。押されたかのように。

私の主張をもう一度言います。1 つの大きなタッチ エリアだけを使用して、残りの部分を計算します。このようにして、タッチ エリアなどを完全に制御できます。

(もう一度、私はあなたの目的を完全に誤解している可能性があります)

于 2012-08-09T01:07:44.017 に答える