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 ピクセル サイズの小さなビューがあるとします。
小さいビューがスーパー ビューの端に非常に近いと仮定すると、このメソッドにより、タッチ可能な領域の半分がスーパービューの外側に拡張され、タッチ可能な領域は実際には 22 x 44 になります。その場合、スーパービューの pointInside をさらに上書きする必要があります。 .
互いに非常に近い 3 つの小さなビューがあるとします。この場合、常に上のビューが優先されます。理想的には、タッチ ポイントに最も近いビューが勝つようにしたいと考えています。
これよりも優れた、またはよりエレガントなソリューションはありますか?
私の懸念をよりよく説明するために、例を挙げましょう。誰もが iOS の Copy Blue Hint Dot に精通しているはずです (正しい言葉を使用しているかどうかはわかりませんが、画像を参照してください)。 http://i.stack.imgur.com/FtjYi.png
それを実装するとします (コピーの青い点)。この青い点については、Apple がどのように実装したかわかりません。ただし、青い点はUIImageViewの一種であり、UITextViewのサブビューであると想定しています(これは確かではないかもしれません)。そのUIImageViewはタッチに反応できますか?私のソリューションでは、pointInSide を上書きすることでタッチに応答できます。このコンテキストでの私の 2 つの質問は、次のように翻訳できます。
- 選択した単語が UITextView の端に近すぎる場合はどうなりますか? したがって、その青い点の理想的なタッチ領域は、スーパービュー (UITextView) の外側にある場合もあります。
- 上の青い点が下の青い点に近すぎて、2 つの点の中間点からドラッグした場合はどうなりますか (下の青い点の方が勝つ可能性が高いようです)。