Я экспериментировал с двумя формами. Во-первых один тип кадра и его код ниже:Странное поведение метода заполнения в разных видах UIBezierPath
((х, у) является происхождение моей UIView
и (ш, ч) является его размер)
[bpath moveToPoint:CGPointMake(x, y)];
[bpath addLineToPoint:CGPointMake(x + w, y)];
[bpath addLineToPoint:CGPointMake(x + w, y + h)];
[bpath addLineToPoint:CGPointMake(x, y + h)];
[bpath closePath];
[bpath moveToPoint:CGPointMake(x + 100, y + 100)];
[bpath addLineToPoint:CGPointMake(x + 100, y + 50)];
[bpath addLineToPoint:CGPointMake(x + 50, y + 50)];
[bpath addLineToPoint:CGPointMake(x + 50, y + 100)];
[bpath closePath];
Это дает мне следующий результат :
И второй один круг внутри круга. Его код ниже:
[bpath moveToPoint:CGPointMake(x + w, y + h * 0.5)];
[bpath addArcWithCenter:CGPointMake(x + w * 0.5, y + h * 0.5) radius:midx startAngle:0 endAngle:2 * M_PI clockwise:YES];
[bpath moveToPoint:CGPointMake(x + w * 0.75, y + h * 0.5)];
[bpath addArcWithCenter:CGPointMake(x + w * 0.5, y + h * 0.5) radius:0.25 * w startAngle:0 endAngle:2 * M_PI clockwise:YES];
А для этого я получил что-то, как показано ниже:
Я применил [bpath fill]
к обоим путям. Итак, почему существует разница в шаблоне заполнения. (Я попробовал добавить closePath
во 2-й случай, но это не имело никакого значения).
Кроме того, есть ли способ получить аналогичную картину заполнения 1-й формы для второго? (я знаю, что это может быть сделано путем добавления второго пути для внутреннего круга, но я хочу сделать это в одном пути)
Update: Я заметил, что если я использую containsPoint
на 2-й путь, он возвращает FALSE
когда касание точка находится внутри внутреннего круга и возвращает TRUE
только тогда, когда точка касания находится между двумя кругами. Аналогичное поведение проявляется и в 1-й форме.
Как я уже упоминал в последней строке, я уже пытался добавить [bpath closePath], и никаких изменений не было. Я попробовал useEvenOddFillRule, но все тот же результат. – blancos
@blancos: Смотрите мое редактирование. Это работает для меня. – DarkDust
Это сработало. Спасибо за решение. Но все еще интересно о 1-й форме. Я не использовал useEvenOddFillRule для этой формы, но в этом случае правильный шаблон заполнения был правильным. Любые причины такого поведения? – blancos