У меня есть 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