提示された回答に問題はありません。ただし、jlarjlarの回答は、他のコントロール(たとえば、SearchBar)と同じ問題に価値を付加できる驚くべき可能性があるため、拡張したいと思いました。これは、pointInsideがUIViewにアタッチされているため、任意のコントロールをサブクラス化できるためです。ため、をてタッチ領域を改善です。この回答は、完全なソリューションを実装する方法の完全なサンプルも示しています。
ボタン(または任意のコントロール)の新しいサブクラスを作成します
#import <UIKit/UIKit.h>
@interface MNGButton : UIButton
@end
次に、サブクラスの実装でpointInsideメソッドをオーバーライドします。
@implementation MNGButton
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
//increase touch area for control in all directions by 20
CGFloat margin = 20.0;
CGRect area = CGRectInset(self.bounds, -margin, -margin);
return CGRectContainsPoint(area, point);
}
@end
ストーリーボード/ xibファイルで問題のコントロールを選択し、IDインスペクターを開いて、カスタムクラスの名前を入力します。
ボタンを含むシーンのUIViewControllerクラスで、ボタンのクラスタイプをサブクラスの名前に変更します。
@property (weak, nonatomic) IBOutlet MNGButton *helpButton;
ストーリーボード/ xibボタンをプロパティIBOutletにリンクすると、サブクラスで定義された領域に合わせてタッチ領域が拡張されます。
pointInsideメソッドをCGRectInsetおよびCGRectContainsPointメソッドと共にオーバーライドすることに加えて、UIViewサブクラスの長方形のタッチ領域を拡張するためにCGGeometryを調べるのに時間をかける必要があります。あなたはまたでCGGeometryのユースケースにいくつかの素晴らしいヒントを見つけることができNSHipster。
たとえば、上記の方法を使用してタッチ領域を不規則にしたり、幅のタッチ領域を水平のタッチ領域の2倍にしたりすることができます。
CGRect area = CGRectInset(self.bounds, -(2*margin), -margin);
注意:UIクラスコントロールを置き換えると、さまざまなコントロール(またはUIImageViewなどの任意のUIViewサブクラス)のタッチ領域を拡張すると、同様の結果が得られます。