如果未存储原始CGPoint,如何将存储的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);
最佳答案
您可以从 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
关于iphone - 如果原始CGPoint丢失,如何将存储的CGPath重新绘制为Bezier路径,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12995555/