Во-первых, я надеюсь, что вы рисуете каждую фигуру в отдельном слое (и я не имею в виду CALayer, я имею в виду внутреннюю конструкцию, уникальную для вашего приложения). Это не только упрощает эту задачу, но и делает отмену более или менее безболезненной (просто переместите последний / самый верхний слой в другой массив и скройте его, и очистите этот массив, когда пользователь рисует новый слой).
Во-вторых, во время построения фигуры не только запомните последний пункт. Создайте CGMutablePath, когда пользователь начинает фигуру, и добавьте каждую последующую точку в качестве другой lineto
. Это также позволяет вам сохранить путь в этом слое, что означает, что вы можете выбросить отрендеренное изображение, если появится предупреждение о нехватке памяти, и заново создать его в следующий раз, когда оно вам понадобится.
В-третьих, каждый раз, когда вы обновляете фигуру во время ее создания, до сих пор получаете ее площадь, лишаете законной силы этот участок и перерисовываете все слои под ним, а также нарисованную фигуру (как она существует до сих пор). То есть перерисовать фон, перекрывая новую фигуру, а затем нарисуйте сверху новую версию новой фигуры.
Как только вы создадите фигуру как единый путь и проведете по этому единственному пути в каждом цикле рисования, пересечения между сегментами исчезнут.