更改UIBezierArc颜色时,仅在句柄内部或外部绘制其句柄

时间:2018-01-23 16:23:22

标签: ios objective-c uibezierpath

我有一个圆形滑块,其中有一个贝塞弧,弧形在滑块的起点和终点有两个手柄,弧形在圆形滑块中绘制。

我可以借助开始和结束手柄在圆形滑块上绘制贝塞尔曲线。

我希望在仅从手柄向内拖动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];
}

1 个答案:

答案 0 :(得分:1)

您已计算出distance

  1. 首先,如果它低于< inOff> outOff,请不要退出。

  2. 相反,请根据distance设置颜色,或许:

    UIColor *arcColor;
    
    if (distance < (inOff - 45)) { 
        arcColor = [UIColor redColor];
    } else if (distance > (outOff + 45)) { 
        arcColor = [UIColor redColor];
    } else { 
        arcColor = [UIColor greenColor];
    }
    

    显然,根据您的需要调整逻辑,但这可能是基本想法。

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

  4. 我没有足够的数据来弄清楚你如何呈现这些弧线,但this repo包含基于触摸更新strokeColor个{arc} CAShapeLayer的示例应用,产生以下内容:

    enter image description here

    我不太担心将您的实现与您的实现进行协调,但它只是说明了上面显示的模式,您可以在touchesBegan中计算要更新的弧并更新{{1}中的颜色}。