我经常讨论过drawRect没有被调用。我经历过很多帖子,但还没有解决我的问题。
解决方案通常被称为调用-setNeedsDisplay
。问题的答案
setNeedsDisplay doesn't call drawRect 表示在子视图中调用它而不是self
。
我创建了一个子视图来绘制按钮。该按钮被选中。
- (IBAction) selected1:(id)sender {
NSLog(@"selected1");
UIButton *button = (UIButton *)sender;
[button setTitle:@"Chosen1" forState:UIControlStateNormal];
[button setTitleColor:[UIColor redColor] forState:UIControlStateDisabled];
// UsableMark *um = [[UsableMark alloc] init ]; // Original
// UsableMark *um = [[UsableMark alloc] initWithFrame:button.frame]; // 1st fix
CGRect umFrame = CGRectMake(0,0,button.frame.size.width,button.frame.size.height); // 2nd fix
UsableMark *um = [[UsableMark alloc] initWithFrame:umFrame ]; // 2nd fix
[button addSubview:um];
[um setNeedsDisplay];
[um release];
button.enabled = NO;
NSLog(@"finished selected1");
}
不会触发UsableMark中的drawRect调用
用 [um setNeedsDisplay]
替换[button setNeedsDisplay]
不会触发drawRect调用
尝试使用self
失败,因为selected1方法是UIApplicaitonDelegate类型的类。找不到方法-setNeedsDisplay。
尝试[self.window setNeedsDisplay]
没有任何进展。
直接调用drawRect(哪一个不想做) CGRect rect = button.frame; [um drawRect:rect];
演示了当前的方法,logging is alive。
分辨率可能很简单,但它逃脱了我。
答案 0 :(得分:1)
问题是init被调用而不是initWithFrame:。由于使用了默认的init,因此视图的框架大小为零,UIKit跳过将其显示为优化。