我创建了一个名为MiniView的UIView子类。
我尝试将它添加到我的viewController中,如下所示:
@interface SomeViewController ()
@property (strong, nonatomic) MiniView *miniView;
@end
- (void)viewDidLoad
{
[super viewDidLoad];
self.miniView = [[MiniView alloc] initWithFrame:CGRectMake(20.f, 20.f, 200.f, 200.f)];
_miniView.backgroundColor = [UIColor blackColor];
[self.view addSubview:_miniView];
}
MiniView类看起来像这样:
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
}
return self;
}
- (void)drawRect:(CGRect)rect
{
NSLog(@"DRAW RECT");
CGContextRef context = UIGraphicsGetCurrentContext();
UIColor * redColor = [UIColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:1.0];
CGContextSetFillColorWithColor(context, redColor.CGColor);
CGContextFillRect(context, self.bounds);
}
但是drawRect永远不会被调用,除非我明确地在setNeedsLayout方法中调用它。它也没有任何吸引力。我试过在drawRect方法中添加一个UIImageView,看起来很好。但上面的代码什么也没有产生。
我也得到错误:
:CGContextSetFillColorWithColor:无效的上下文0x0。这是 一个严重的错误。此应用程序或它使用的库正在使用 无效的上下文,从而导致整体退化 系统稳定性和可靠性。这个通知是礼貌的:拜托 解决这个问题。在即将到来的更新中,它将成为一个致命的错误。
如果我在drawRect方法中打印一个日志语句并输出'rect'值,它在200 x 200时是正确的,所以我不知道为什么上下文是0x0。
所以一个问题是从不调用drawRect,另一个问题是如果我明确地调用它,则不显示任何内容......
答案 0 :(得分:1)
您可能需要在自定义UIView子类上调用setNeedsDisplay
:
- (void)viewDidLoad {
[super viewDidLoad];
self.miniView = [[MiniView alloc] initWithFrame:CGRectMake(20.f, 20.f, 200.f, 200.f)];
_miniView.backgroundColor = [UIColor blackColor];
[_miniView setNeedsDisplay]; // Added this
[self.view addSubview:_miniView];
}
这基本上是告诉系统需要重新绘制UIView
的一种方法。有关详细信息,请参阅the docs。
答案 1 :(得分:1)
按要求发布单独答案:
实际问题是我在MiniView类中重新定义了setNeedsDisplay
方法,如下所示:
- (void)setNeedsDisplay
{
NSLog(@"Redrawing info: %@", [_info description]);
}
因为我忽略了对[super setNeedsDisplay]
的调用,所以drawRect从未被调用过,没有任何东西在绘制。所以这解决了它:
- (void)setNeedsDisplay
{
[super setNeedsDisplay];
NSLog(@"Redrawing info: %@", [_info description]);
}
答案 2 :(得分:0)
永远不要调用drawRect表达,试试这个:
- (void)viewDidLoad
{
[super viewDidLoad];
self.miniView = [[MiniView alloc] initWithFrame:CGRectMake(20.f, 20.f, 200.f, 200.f)];
_miniView.backgroundColor = [UIColor blackColor];
[self.view addSubview:_miniView];
[_miniView setNeedsDisplay];
}
答案 3 :(得分:0)
在你的直接方法中包括这一行: -
[super drawRect:rect];