Ios 更改UIBezierArc颜色,当其控制柄仅从控制柄内部或外部绘制时

Ios 更改UIBezierArc颜色,当其控制柄仅从控制柄内部或外部绘制时,ios,objective-c,uibezierpath,Ios,Objective C,Uibezierpath,我有一个圆形滑块,里面画了一个贝塞尔圆弧,一个圆弧在滑块的起点和终点有两个手柄,圆弧在圆形滑块中画 我能够绘制贝塞尔曲线沿圆形滑块的帮助下开始和结束处理 我想改变颜色的弧时,它被拖动45内或45外从处理只,它不应该改变弧颜色时,它被拖动在圆形滑块 注意-在内外拖动时,不应改变其他滑块弧的颜色。 仅当在内部和外部拖动时,颜色才应更改,而不是在圆形中拖动时 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { [supe

我有一个圆形滑块,里面画了一个贝塞尔圆弧,一个圆弧在滑块的起点和终点有两个手柄,圆弧在圆形滑块中画

我能够绘制贝塞尔曲线沿圆形滑块的帮助下开始和结束处理

我想改变颜色的弧时,它被拖动45内或45外从处理只,它不应该改变弧颜色时,它被拖动在圆形滑块

注意-在内外拖动时,不应改变其他滑块弧的颜色。

仅当在内部和外部拖动时,颜色才应更改,而不是在圆形中拖动时

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesMoved:touches withEvent:event];
_dragging = YES;

if (!self.isDragging)
{
    return;
}

if ([self.delegate respondsToSelector:@selector(sliderDraggin:)])
{
    [self.delegate sliderDraggin:self];
}

UITouch *touch = [touches anyObject];
//UITouch *touch = [touches anyObject];

NSUInteger nearestHandleIndex = [self indexOfNearesPointForTouch:touch];
_nearesHandle = (nearestHandleIndex != NSNotFound) ? _handles[@(nearestHandleIndex)] : nil;


CGPoint location = [touch locationInView:self];
CGFloat distance = [_math distanceBetweenPoint:_centerPoint andPoint:location];



CGFloat inOff = _radius - _sliderWidth - _offset.inside;
CGFloat outOff = _radius + _offset.outside;

if (distance < inOff || distance > outOff)
{
    if (self.isNeedToRevoke)
    {
        _dragging = NO;
        return;
    }
}

dispatch_async(dispatch_get_main_queue(), ^{
    int a = AngleFromNorth(_centerPoint, location, EVA_FLIPPED);
    [self moveView:_nearesHandle toAngle:a];

    [self drawArc];
});

[self informDelegateAboutHandles];
}
-(无效)触摸移动:(NSSet*)触摸事件:(UIEvent*)事件
{
[超级触摸移动:触摸事件:事件];
_拖动=是;
如果(!self.isDraging)
{
返回;
}
if([self.delegate respondsToSelector:@selector(sliderDraggin:)]))
{
[self.delegate sliderDraggin:self];
}
UITouch*touch=[触摸任何对象];
//UITouch*touch=[触摸任何对象];
NSUInteger nearestHandleIndex=[self indexOfNearesPointForTouch:touch];
_nearesHandle=(NeareShandleIndex!=NSNotFound)?\u句柄[@(NeareShandleIndex)]:nil;
CGPoint位置=[触摸位置查看:自];
CGFloat距离=[[点:中心点和点:位置之间的数学距离];
CGFloat inOff=_半径-_滑块宽度-_偏移量。内部;
CGFloat outOff=_半径+_偏移量。外部;
如果(距离outOff)
{
if(self.isNeedToRevoke)
{
_拖动=否;
返回;
}
}
dispatch\u async(dispatch\u get\u main\u queue()^{
int a=从北的角度(_中心点,位置,EVA_翻转);
[自动移动视图:_neareshandletoangle:a];
[自吸弧];
});
[self-informDelegateAboutHandles];
}

您已经计算了
距离

  • 因此,首先,如果它小于
    >outOff
    ,请不要退出

  • 相反,根据距离设置颜色,可能是:

    UIColor *arcColor;
    
    if (distance < (inOff - 45)) { 
        arcColor = [UIColor redColor];
    } else if (distance > (outOff + 45)) { 
        arcColor = [UIColor redColor];
    } else { 
        arcColor = [UIColor greenColor];
    }
    
    UIColor*arcColor;
    如果(距离<(inOff-45)){
    arcColor=[UIColor redColor];
    }如果(距离>(输出+45)){
    arcColor=[UIColor redColor];
    }否则{
    arcColor=[UIColor greenColor];
    }
    
    很明显,如果你认为合适的话,可以调整逻辑,但这可能是最基本的想法

  • 使用此
    arcColor
    更新绘图例程使用的任何特定于颜色的属性


  • 我没有足够的资料来了解您是如何渲染这些圆弧的,但是包含了一个示例应用程序,该应用程序根据触摸情况为各个圆弧更新
    CAShapeLayer
    strokeColor
    ,产生以下结果:


    我不太担心如何协调我的实现和你的实现,但它只是说明了上面显示的模式,在这里,您计算要在
    触摸中更新的弧开始
    并在
    触摸移动

    中更新颜色。在这种情况下,当我按handle并在滑块内部或外部拖动时,需要一些额外的宽度,我将其更改为45到5,因此,当我拖动较长的内部和较长的外部时,颜色会改变。如果我需要在滑块宽度内外做任何事情,我想在拖动手柄离开滑块后立即修改颜色值-在我们的外部内部,然后我将更新到另一种颜色,即45内外。请建议我,如果我尝试将1个处理程序拖动到内部,当它接近第二个滑块时,在这种情况下,滑块弧1和滑块2都获得相同的颜色。是否可以限制仅更改选定的弧处理程序颜色。请更新我。你能帮我解决这个问题吗?根据你最初的描述,我推断你想根据离弧中心的距离改变整个弧的颜色(我认为这就是你的黑色箭头所指示的)。我很抱歉,但我不理解你在这里的任何评论。在这一点上,恐怕我完全不知道你想要实现什么。也许可以编辑你的问题,包括一些快照(即使是手绘的),显示你希望它在手势的各个点上看到什么(可能有一些视觉提示,说明用户的手指在该点的位置)。