重新访问setNeedsDisplay

时间:2011-04-23 18:45:12

标签: objective-c ipad uibutton drawrect

我经常讨论过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。

分辨率可能很简单,但它逃脱了我。

1 个答案:

答案 0 :(得分:1)

问题是init被调用而不是initWithFrame:。由于使用了默认的init,因此视图的框架大小为零,UIKit跳过将其显示为优化。