如果未存储原始CGPoints,如何将存储的CGPath重绘为Bezier路径?
这是代码,但它不起作用(路径在标准模式下重绘而不是在Bezier模式下重绘):
CGMutablePathRef UpathFREEHAND = CGPathCreateMutable();
CGPoint firstPointFH = [[pointArray objectAtIndex:0] CGPointValue];
CGPathMoveToPoint(UpathFREEHAND, NULL, firstPointFH.x, firstPointFH.y);
for (int i = 0; i < [pointArray count]; i++)
{
CGPathAddLineToPoint(UpathFREEHAND, NULL, [[pointArray objectAtIndex:i] CGPointValue].x,
[[pointArray objectAtIndex:i] CGPointValue].y);
}
CGMutablePathRef _TempPathForUndo = UpathFREEHAND;
//Add PATH object to array
[UPath addObject:CFBridgingRelease(_TempPathForUndo)];
//Load PATH object from array
_TTempPathForUndo = (__bridge CGMutablePathRef)([UPath objectAtIndex:i]);
// Now create the UIBezierPath object.
UIBezierPath *bp;
bp = [UIBezierPath bezierPath];
bp.CGPath = _TTempPathForUndo;
CGContextAddPath(context, bp.CGPath);
//Color, Brush Size parameters, Line cap parameters..
CGContextStrokePath(context);
答案 0 :(得分:3)
您可以使用UIBezierPath
中的以下方法:
+ (UIBezierPath *)bezierPathWithCGPath:(CGPathRef)CGPath
CGPath
的重用有效。请检查此示例,在TestView
中添加UIViewController
并关联UIButton
,以便在使用[_testView setNeedsDisplay]
点击重绘时强制重绘:
// TestView.h
#import <UIKit/UIKit.h>
@interface TestView : UIView {
CGMutablePathRef _path;
BOOL _nextDraws;
}
@end
// TestView.m
#import "TestView.h"
@implementation TestView
- (void)drawRect:(CGRect)rect {
BOOL firstDraw = !_nextDraws;
CGContextRef ctx = UIGraphicsGetCurrentContext();
if (firstDraw) {
NSLog(@"first draw");
_path = CGPathCreateMutable();
CGPathMoveToPoint(_path, NULL, 0, 0);
CGPathAddLineToPoint(_path, NULL, CGRectGetMaxX(rect), CGRectGetMaxY(rect));
CGPathCloseSubpath(_path);
CGContextAddPath(ctx, _path);
CGContextSetStrokeColorWithColor(ctx,[UIColor whiteColor].CGColor);
CGContextStrokePath(ctx);
_nextDraws = YES;
}
else {
NSLog(@"next draws");
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextClearRect(ctx, rect);
UIBezierPath * bezierPath = [UIBezierPath bezierPathWithCGPath:_path];
CGContextAddPath(ctx, bezierPath.CGPath);
CGContextSetStrokeColorWithColor(ctx,[UIColor whiteColor].CGColor);
CGContextStrokePath(ctx);
}
}
- (void)dealloc {
CGPathRelease(_path);
[super dealloc];
}
@end
答案 1 :(得分:0)
swift 3.0版本的atxe答案:
let myCGPath: CGPath = // stored CGPath or path taken from another object
let bezierPath = UIBezierPath(cgPath: myCGPath)