Почему метод `[bezierPath closePath]` не закрывает мой путь?

У меня есть NSArray, который содержит CGPoints, и я рисую путь, который возвращаю из этого класса. Проблема в том, что [bezierPath closePath] не закрывает мой путь в этом классе. Почему это? Мне нужно соединить конечную точку с первой точкой из массива, используя кривую, которую дает мне этот класс, и сделать путь полностью закрытым/связанным и непрерывным, используя этот класс. Что еще я должен сделать, кроме [bezierPath closePath], потому что он ничего не делает, когда я использую это в своем методе drawrect. Любая помощь приветствуется.

код для класса UIBezierPath (SmoothPath):

UIBezierPath+SmoothPath.h:
#import <UIKit/UIKit.h>
@interface UIBezierPath (SmoothPath)
+ (UIBezierPath*)smoothPathFromArray:(NSArray*)arr;
@end

А также

  UIBezierPath+SmoothPath.m:

    #import "UIBezierPath+SmoothPath.h"

    @implementation UIBezierPath (SmoothPath)

    + (UIBezierPath*)smoothPathFromArray:(NSArray*)arr{
        if ([arr count] > 0){
            UIBezierPath *bezierPath = [UIBezierPath bezierPath];

            NSMutableArray *pts = [arr mutableCopy];
            int i = 0;
            for (; i < pts.count - 4 ; i+= 3){
                CGPoint temp = CGPointMake(([pts[i+2] CGPointValue].x + [pts[i+4] CGPointValue].x)/2.0,
                                           ([pts[i+2] CGPointValue].y + [pts[i+4] CGPointValue].y)/2.0);
                pts[i+3] = [NSValue valueWithCGPoint:temp];

                [bezierPath moveToPoint:[pts[i] CGPointValue]];
                [bezierPath addCurveToPoint:temp controlPoint1:[pts[i+1] CGPointValue] controlPoint2:[pts[i+2] CGPointValue]];
            }

            switch (pts.count - i) {
                case 4:
                    [bezierPath moveToPoint:[pts[i] CGPointValue]];
                    [bezierPath addCurveToPoint:[pts[i+3] CGPointValue] controlPoint1:[pts[i+1] CGPointValue] controlPoint2:[pts[i+2] CGPointValue]];
                    break;
                case 3:
                    [bezierPath moveToPoint:[pts[i] CGPointValue]];
                    [bezierPath addCurveToPoint:[pts[i+2] CGPointValue] controlPoint1:[pts[i] CGPointValue] controlPoint2:[pts[i+1] CGPointValue]];
                    break;
                case 2:
                    [bezierPath moveToPoint:[pts[i] CGPointValue]];
                    [bezierPath addLineToPoint:[pts[i+1] CGPointValue]];
                    break;
                case 1:
                    [bezierPath addLineToPoint:[pts[i] CGPointValue]];
                    break;

                default:
           }
        [bezierpath closePath];
        return bezierPath;
    }
    return nil;
}
@end

person Community    schedule 25.09.2016    source источник


Ответы (1)


Вы продолжаете двигаться по пути (moveToPoint). Это делает прерывистый путь, поэтому его закрытие просто возвращает к началу последнего раздела. Когда вы добавляете кривую или линию к пути, текущая точка пути перемещается в конец этой кривой или линии. Используйте moveToPoint только в начале при установке начальной точки пути.

person jrturton    schedule 25.09.2016
comment
Большое спасибо, поэтому я сделал это [bezierPath moveToPoint:[pts[0] CGPointValue]]; и вывел эту строку из цикла for, а затем использовал [path closePath], чтобы закрыть путь, и он закрывает путь, но все же часть между конечной точкой и начальной точкой (последний индекс массива и первый индекс) не является гладким. Как я могу сделать так, чтобы он выглядел непрерывно гладким даже на стыке конечной точки и начальной точки? - person ; 25.09.2016
comment
Вам нужно рассчитать кривую, как вы это делаете с другими точками. Закрытие пути всегда будет делать прямую линию. Рассчитайте кривую обратно к началу, добавьте ее, затем закройте путь. - person jrturton; 26.09.2016