2011-04-23 37 views
2

我有經常討論的drawRect沒有被調用。我經歷了很多帖子,但還沒有解決我的問題。setNeedsDisplay revisited

該溶液通常被描述爲調用-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調用未觸發。
[button setNeedsDisplay]代替[um setNeedsDisplay]不會觸發drawRect調用。
嘗試使用self失敗,因爲selected1方法是UIApplicaitonDelegate類型的類。 Method -setNeedsDisplay未找到。

試圖[self.window setNeedsDisplay]給沒有取得任何進展。

直接調用drawRect中(其中一個並不想這樣做)CGRect rect = button.frame; [um drawRect:rect];說明了本方法,記錄是活的。

分辨率可能很簡單,但它脫離了我。

+1

你重寫了UsableMark tomset默認框架中的init方法嗎?如果不是,框架將具有零大小,並且UIKit可以跳過將其顯示爲性能操作。 – ughoavgfhw 2011-04-23 20:13:04

+0

是否覆蓋了initWithFrame。但是使用的init沒有它。 修改了代碼以使用initWithFrame。 現在調用initWithFrame。 drawRect也是如此! – Refactor 2011-04-23 22:29:22

+0

謝謝。 drawRect被調用。將您的評論更改爲答案,然後我會對其進行標記。現在來研究爲什麼drawRect繪圖不可見的問題。 – Refactor 2011-04-23 23:10:32

回答

1

的問題是,init程序調用,而不是initWithFrame :.由於使用了默認初始化,所以視圖的框架大小爲零,並且UIKit跳過將其顯示爲優化。