Я пытаюсь выяснить, как построить ограниченный диапазон значений с плавающей запятой, основанный на скорости UIPanGestureRecognizer
. Я имею минимальное или начальное значение 1.0 и максимум 3.0, чтобы предоставить ограниченный диапазон для UIBezierPath
lineWidth
.UIBezierPath lineWidth на основе скорости UIPanGestureRecognizer
Я пытаюсь выяснить, как построить экспоненциальный диапазон от 1,0 до 3,0, основанный соответственно на скорости UIPanGestureRecognizer
, но у меня есть трудное время, когда я должен начать отображение значений. Чем быстрее объединенная скорость x и y, тем меньше (до 1.0) ширина линии должна быть, и, соответственно, противоположной до 3.0, если комбинированная скорость будет медленнее. Я также пытаюсь сузить/сгладить ширину линии, сохраняя свойство lastWidth
, чтобы переходы не были заметны между субпатами.
Я был бы признателен за предлагаемую помощь.
Работа и окончательный код на основе ответа:
@property (nonatomic, assign) CGFloat lastWidth;
if (recognizer.state == UIGestureRecognizerStateChanged)
{
CGPoint velocity = [recognizer velocityInView:self.view];
CGFloat absoluteVelocity = 1000.0/sqrtf(pow(velocity.x, 2) + pow(velocity.y, 2));
CGFloat clampedVel = MAX(MIN(absoluteVelocity, 3.0), 1.0);
if (clampedVel > self.lastWidth)
{
clampedVel = self.lastWidth + 0.15;
}
else if (clampedVel < self.lastWidth)
{
clampedVel = self.lastWidth - 0.15;
}
self.lastWidth = clampedVel;
UIBezierPath *path = [UIBezierPath bezierPath];
path.lineCapStyle = kCGLineCapRound;
path.lineWidth = self.lastWidth;
}
Alex, мне все еще нужно сохранить свойство последней ширины строки, чтобы я мог сгладить линию, проходящую от последней? – klcjr89
Кроме того, я пробовал четыре функции, которые вы создали, только функции getLinearWidthForVelocity и 'getSqrtWidthForVelocity' меняют ширину линии, что я и хочу, остальные две функции остаются статическими размерами, даже играя с' rootConstantYouCanAdjust' (установите его на 80000) и не изменили ширину линии. – klcjr89
Упс. совершил ошибку там. Должно быть 2/v и 2/(pow (v, rootConstantYouCanAdjust)) соответственно вместо 1 в числителе. Что касается сохранения предыдущего значения, просто используйте: @ property (nonatomic) CGFloat previousWidth; в вашем интерфейсе @ и просто перезагружайте его каждый раз, когда вы вызываете функцию, которая обновляет строку. – AlexKoren