2010-04-10 2 views
38

나는 UIImageView를 서브 클래 싱하고 drawRect를 오버라이드하려고 했으므로 Quartz 2D를 사용하여 이미지의 맨 위에 그릴 수 있었다. 나는 이것이 멍청한 초짜 문제라는 것을 알고있다. 그러나 나는 내가 잘못한 것을 보지 않고있다.UIImageView의 서브 클래스에서 drawRect가 호출되지 않는다.

#import <UIKit/UIKit.h> 

@interface UIImageViewCustom : UIImageView { 

} 
- (void)drawRect:(CGRect)rect; 
@end 

및 구현 : 다음은 인터페이스의

#import "UIImageViewCustom.h" 

@implementation UIImageViewCustom 

- (id)initWithFrame:(CGRect)frame { 
    if (self = [super initWithFrame:frame]) { 
    } 
    return self; 
} 

- (void)drawRect:(CGRect)rect { 
    // do stuff 
} 

- (void)dealloc { 
    [super dealloc]; 
} 
@end 

나는 drawRect에 중단 점을 설정하고는 전혀 호출되지 없구요 생각하는 저를 선도 명중하지 않았다. 처음 뷰가로드 될 때 호출되지 않아야합니까? 내가 잘못 재정의 한 적이 있습니까?

+0

업데이트 된 답변을 참조하십시오. 다시 불편을 끼쳐 드려 죄송합니다. –

+0

괜찮습니다. 내가 UIMLView 대신 UIView의 하위 클래스를 만들면 작동하는 것을 관찰 한 문서를 살펴 보았습니다. 이제는 하위 클래스에 UIImageView의 속성을 추가 할 수 있습니다. 한 번만 내 tableview 셀의 배경을 그렸습니다. 자세한 내용은 check.http : //stackoverflow.com/questions/1784827/draw-a-custom-cell-for-tableview-uitableview-with-changed-colors-and-separa에서 확인하십시오. –

답변

80

보기가 보이고 더러운 경우에만 호출됩니다. 어쩌면 문제는 뷰를 생성하는 코드에서, 또는 코코아 콩에서 코드를 생성하는 경우 문제가 될 수 있습니다.

또한 "릴리스"빌드를 디버깅하려는 경우에도 중단 점이 올바르게 설정되지 않을 수 있습니다.


나는 UIImageView를 서브 클래 싱하는 것을 처음 보았습니다. 워드 프로세서에서 :

특별 고려 사항

있는 UIImageView 클래스는 표시로 그 이미지를 그려 에 최적화되어 있습니다. UIImageView는 서브 클래스에서 drawRect :를 호출하지 않습니다. 하위 클래스에 사용자 지정 그리기 코드가 필요한 경우 UIView를 기본 클래스로 사용하는 것이 좋습니다.

그래서 여기 있습니다. [UIImage drawInRect :]를 사용하여 이미지를 그리거나 CALayer를 사용하여 이미지를 그리는 것이 얼마나 쉬운지를 감안할 때 어쨌든 UIImageView를 서브 클래 싱하는 좋은 이유는 없을 것입니다.

+0

은 뷰가 처음 인 경우 drawRect가 호출되면 안됩니다. 그래도 렌더링? –

+0

사실, 당신이 그것을 언급 했으니, 나는 그것을 읽었던 것을 기억합니다. 왜 내가 그것을 찾을 때 그것을 다시 찾을 수 없었는지 모르겠다. 감사. –

+1

'UIImageView'는 IB와 함께 작업하기를 원한다면 하위 클래스로 나눌 수있는 좋은 방법입니다. 한숨 ... 대답 주셔서 감사합니다. –

0

직접 질문에 대답하지만, 문제를 해결할 수 없음 :

왜있는 UIImageView의 서브 클래스로이 작업을 수행? 하위 클래스 화는 항상 문제가 될 수 있습니다. 특히 하위 클래스로 설계되지 않은 클래스의 경우에는 문제가 될 수 있습니다. UIImageView는 그렇지 않습니다. 이미지 위에 물건을 그려 넣고 싶다면 투명한 배경으로 뷰를 만들고 원하는대로 그려서 이미지 위에 직접 놓으십시오.

+1

OK, 괜찮아요. 문서에서 찾은 것 같아서 분명히 서브 클래 싱하는 것이 좋습니다. 나는 여전히 이것이 목표를 달성하는 최선의 방법이 아니라고 생각한다. – jasoncrawford

1

편집을 추가해보십시오 :

- (id)initWithFrame:(CGRect)frame{ 
    if (self = [super initWithFrame:frame]) { 
     [self setClearsContextBeforeDrawing:YES];//add this line also 
    } 
    return self; 
} 


- (void)setNeedsDisplay{ 
    [self setNeedsDisplayInRect:self.frame]; 
} 

코드에.

희망이 도움이됩니다.

감사합니다,

madhup

+0

제안 해 주셔서 감사합니다. 그러나 그 중 하나가 작동하지 않습니다 :-( –

+0

업데이트가 작동하지 않았습니다. –

+0

clearsContextBeforeDrawing은 기본적으로 YES입니다! – daveoncode

-1

나는 당신의 특정한 경우에 따라서는 의미가 대신 배경 이미지로 UIButton을 사용할 수 있도록 수있는 UIImageView가의 drawRect

0

를 대체 사용할 수없는 것 같아요 UIImageView.userInteractionEnabled을 NO로 설정하여 결과를 UIImageView와 구별 할 수 있습니다. 이 경우

UIButton 서브 클래스는 단순히이 포함됩니다 :

- (void)drawRect:(CGRect)rect 
{ 
    if (kSomethingSpecial) { 
    [self setBackgroundImage:[UIImage imageNamed:@"RedBackground.png"] 
        forState:UIControlStateNormal]; 
    } 
} 

책임의 한계와 법적 고지 - 당신이 버튼으로 이미지를 사용하는 시간의 적어도 일부 계획이 있다면 난 단지이 추천 할 것입니다. Apple이 Mark와 같이 API를 이런 식으로 작성해야하는 이유가 있다고 확신하기 때문에 을 UIImageView에있는이 drawRect 동작의 해결 방법으로 사용하는 것을 전심으로지지 할 수는 없습니다.

관련 문제