我有一个圆形的UIView。我必须只检测紫色圆圈内的触摸。圆圈外的所有触摸,例如。必须忽略黑色方形和白色背景。
设置半径和检测触摸将没有任何用处,因为当多个视图在不同控制器的基础上彼此叠加时,将难以管理。
有什么办法,我可以这样做。请你给我一些建议。
答案 0 :(得分:5)
创建UIView
的自定义子类,说CircularView
并覆盖pointInside:withEvent:
方法以忽略位于圆圈外的点。这个子类的一个对象是自包含的,你可以用你想要的任何方式来安排它。
要确定圆形区域是否包含点,您可以使用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
就是这样。
答案 1 :(得分:2)
您可以轻松应用触摸条件如果您有圆的半径。 检查圆圈的触摸点和中心之间的距离,检查距离是否小于圆的半径,然后触摸,否则忽略它。
您可以使用以下方法计算距离:
-(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.
}
}
答案 2 :(得分:1)
为你的圈创建一个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'变量,但这种方式更容易测试。
答案 3 :(得分:-2)
你可以简单地制作一个按钮,并将其设置为自定义尺寸并使其成为圆形,并且每当用户触摸它时,它可以将1添加到触摸次数的整数或浮点数。就那么简单。