我有一个圆形的 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”变量,但这种方式更容易测试。
您可以简单地制作一个按钮并将其设置为自定义大小并使其成为圆形,并且任何时候用户触摸它,它都可以将 1 添加到触摸次数的整数或浮点数上。就那么简单。