私は丸みを帯びたUIViewを持っています。紫色の円の内側でのみタッチを検出する必要があります。黒い四角と白い背景など、円の外側のすべてのタッチは無視する必要があります。
半径を設定してタッチを検出しても意味がありません。異なるコントローラーで複数のビューが重なり合っていると、管理が難しくなるためです。
方法はありますか、私はこれを行うことができます。これを行うためのいくつかの提案を教えてください。
私は丸みを帯びたUIViewを持っています。紫色の円の内側でのみタッチを検出する必要があります。黒い四角と白い背景など、円の外側のすべてのタッチは無視する必要があります。
半径を設定してタッチを検出しても意味がありません。異なるコントローラーで複数のビューが重なり合っていると、管理が難しくなるためです。
方法はありますか、私はこれを行うことができます。これを行うためのいくつかの提案を教えてください。
のカスタム サブクラスを作成し、メソッドをオーバーライドしてUIView
、円の外側にあるポイントを無視します。このサブクラスのオブジェクトは自己完結型であり、任意の方法で配置できます。CircularView
pointInside:withEvent:
円形領域にポイントが含まれているかどうかを確認するには、Core Graphics 関数CGPathContainsPoint
または のcontainsPoint:
メソッドを使用できますUIBezierPath
。そのためには、円を表すまたはオブジェクトを覚えておく必要があります。この例では、 を使用して循環パスを作成し、それがクラスのプロパティとして格納されていると想定しています。CGPathRef
UIBezierPath
UIBezierPath
CircularView
@interface CircularView : UIView
// initialize this when appropriate
@propery (nonatomic, strong) UIBezierPath *circularPath;
@end
@implementation CircularView
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
return [circularPath containsPoint:point];
}
@end
以上です。
円の半径があればタッチする条件を簡単に適用できます。タッチポイントと円の中心の間の距離を確認し、距離が円の半径よりも小さいかどうかを確認してから、タッチで作業します。そうでない場合は無視します。
次の方法を使用して距離を計算できます。
-(float)distanceWithCenter:(CGPoint)current with:(CGPoint)SCCenter
{
CGFloat dx=current.x-SCCenter.x;
CGFloat dy=current.y-SCCenter.y;
return sqrt(dx*dx + dy*dy);
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
CGFloat radius=5;
CGPoint centerOfCircle=CGPointMake(140,200);
UITouch *touch=[touches anyObject];
CGPoint touchPoint=[touch locationInView:self.view];
CGFloat distance=[self distanceWithCenter:centerOfCircle with:touchPoint];
if (distance<=radius) {
//perform your tast.
}
}
サークルのUIViewのサブクラスを作成し、次のようにPointInsideをオーバーライドします。
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
if (![super pointInside:point withEvent:event])
{
return NO;
}
BOOL isInside = (pow((point.x-self.frame.size.width/2), 2) + pow((point.y - self.frame.size.height/2), 2) < pow((self.frame.size.width/2), 2)) ? YES:NO;
return isInside;
}
'isInside' variabeを捨てることができますが、この方法の方がテストが簡単です。
ボタンを作成してカスタムサイズに設定し、そのように円形にするだけで、ユーザーがボタンに触れるたびに、整数または浮動小数点数に 1 を追加できます。そのような単純な。