CGContextFillRects:CGRect* 不工作。分配的 CGRect 项目不会保存
CGContextFillRects: CGRect* not working. Assigned CGRect items do not get saved
我正在尝试保存 CGRect 数组以与 CGContextFillRects 一起使用,但我分配给 minorPlotLines 数组的 CGRect 变量似乎没有保存。当这里的对象绘制自己时,minorPlotLines 是空的!有谁知道是怎么回事吗?
@interface GraphLineView () {
int numberOfLines;
CGRect *minorPlotLines;
}
@end
@implementation GraphLineView
- (instancetype) initWithFrame: (CGRect) frame {
self = [super initWithFrame:frame];
if (self) {
// Init code
[self setupView];
}
return self;
}
- (instancetype) initWithCoder: (NSCoder *) aDecoder {
if(self == [super initWithCoder:aDecoder]){
[self setupView];
}
return self;
}
- (void) dealloc {
free(minorPlotLines);
}
- (void) setupView {
numberOfLines = 40;
minorPlotLines = malloc(sizeof(struct CGRect)*40);
for(int x = 0; x < numberOfLines; x += 2){
//minorPlotLines[x] = *(CGRect*)malloc(sizeof(CGRect));
minorPlotLines[x] = CGRectMake(x*(self.frame.size.width/numberOfLines), 0, 2, self.frame.size.height);
// minorPlotLines[x+1] = *(CGRect*)malloc(sizeof(CGRect));
minorPlotLines[x+1] = CGRectMake(0, x*(self.frame.size.height/numberOfLines), self.frame.size.width, 2);
}
[self setNeedsDisplay];
}
- (void) drawRect:(CGRect)rect {
// Drawing code
[super drawRect:rect];
for(int x = 0; x < numberOfLines; x += 2){
NSLog(@"R %d = %f", x, minorPlotLines[x].origin.x);
NSLog(@"R %d = %f", x+1, minorPlotLines[x+1].origin.y);
}
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, [[UIColor yellowColor] CGColor]);
CGContextFillRects(context, minorPlotLines, numberOfLines);
}
我试过将你的代码(构建 minorPlotLines
的内容,然后再读回内容)到另一个项目中,它似乎确实很好地保留了内容,所以你的基本代码本身似乎声音。
我会检查以确保您在构建数组 minorPlotLines
时确实有一个非零帧(即在 -setupView
中)。在您的 class 仅部分构建时调用早期 UI class 加载回调是很常见的(例如 UIViewController class' 回调 -viewDidLoad
),让您别无选择,只能将某些决定推迟到加载过程的后期。布局在游戏中发生的时间相对较晚,并且由于您的 -setupView
方法是在 -init
方法中调用的,所以我猜框架还没有为您的 class 提供任何布局,因此它没有可用的框架(即你的框架实际上等同于 CGRectZero
)。
我正在尝试保存 CGRect 数组以与 CGContextFillRects 一起使用,但我分配给 minorPlotLines 数组的 CGRect 变量似乎没有保存。当这里的对象绘制自己时,minorPlotLines 是空的!有谁知道是怎么回事吗?
@interface GraphLineView () {
int numberOfLines;
CGRect *minorPlotLines;
}
@end
@implementation GraphLineView
- (instancetype) initWithFrame: (CGRect) frame {
self = [super initWithFrame:frame];
if (self) {
// Init code
[self setupView];
}
return self;
}
- (instancetype) initWithCoder: (NSCoder *) aDecoder {
if(self == [super initWithCoder:aDecoder]){
[self setupView];
}
return self;
}
- (void) dealloc {
free(minorPlotLines);
}
- (void) setupView {
numberOfLines = 40;
minorPlotLines = malloc(sizeof(struct CGRect)*40);
for(int x = 0; x < numberOfLines; x += 2){
//minorPlotLines[x] = *(CGRect*)malloc(sizeof(CGRect));
minorPlotLines[x] = CGRectMake(x*(self.frame.size.width/numberOfLines), 0, 2, self.frame.size.height);
// minorPlotLines[x+1] = *(CGRect*)malloc(sizeof(CGRect));
minorPlotLines[x+1] = CGRectMake(0, x*(self.frame.size.height/numberOfLines), self.frame.size.width, 2);
}
[self setNeedsDisplay];
}
- (void) drawRect:(CGRect)rect {
// Drawing code
[super drawRect:rect];
for(int x = 0; x < numberOfLines; x += 2){
NSLog(@"R %d = %f", x, minorPlotLines[x].origin.x);
NSLog(@"R %d = %f", x+1, minorPlotLines[x+1].origin.y);
}
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, [[UIColor yellowColor] CGColor]);
CGContextFillRects(context, minorPlotLines, numberOfLines);
}
我试过将你的代码(构建 minorPlotLines
的内容,然后再读回内容)到另一个项目中,它似乎确实很好地保留了内容,所以你的基本代码本身似乎声音。
我会检查以确保您在构建数组 minorPlotLines
时确实有一个非零帧(即在 -setupView
中)。在您的 class 仅部分构建时调用早期 UI class 加载回调是很常见的(例如 UIViewController class' 回调 -viewDidLoad
),让您别无选择,只能将某些决定推迟到加载过程的后期。布局在游戏中发生的时间相对较晚,并且由于您的 -setupView
方法是在 -init
方法中调用的,所以我猜框架还没有为您的 class 提供任何布局,因此它没有可用的框架(即你的框架实际上等同于 CGRectZero
)。