【问题标题】:setNeedsDisplay revisited重新访问 setNeedsDisplay
【发布时间】:2011-04-23 18:45:12
【问题描述】:

我经常讨论的 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];演示了当前的方法,日志记录是有效的。

解决方法可能很简单,但它让我无法理解。

【问题讨论】:

  • 你是否覆盖了 UsableMark 中的 init 方法设置默认框架?否则,框架的大小将为零,并且 UIKit 可能会跳过将其显示为性能操作。
  • 确实覆盖了 initWithFrame。但是使用的init没有它。已修改代码以使用 initWithFrame。现在调用 initWithFrame。 drawRect 也是如此!
  • 谢谢。调用drawRect。将您的评论更改为答案,我会标记它。现在来研究为什么 drawRect 绘图不可见的问题。
  • drawRect,一旦执行,并没有产生可见的结果,因为 initWithFrame 中提供的框架应该是 0,0,button.frame.size.width, frame.size.height 而不是框架。最终绘制的双偏移量,并且给定按钮位置,它是“屏幕外”。

标签: objective-c ipad uibutton drawrect


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    • 2019-12-22
    相关资源
    最近更新 更多