2012-10-17 2 views
0

상당히 큰 폼을 포함하는 응용 프로그램이 있습니다. UILabel을 서브 클래스 화하여 양식 레이블에 일관성을 가질 수있었습니다. 그러나 레이블 중 일부는 배경색이있는 섹션 구분선이 될 것이며 들여 쓰기가 필요할 것입니다.iOS : UILabel의 서브 클래스 화 및 들여 쓰기 업데이트

는 나는이 코드를 사용하여 인스턴스화 할 때 내가 위로 UILabel의의 들여 쓰기 설정을 탈 수 있습니다 알고

- (void)drawTextInRect:(CGRect)rect { 
    UIEdgeInsets insets = {0, 5, 0, 5}; 
    return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)]; 
} 

하지만 라벨의 모든 세트를 추가합니다. 내가 원하는 건 아니야. 그와

- (void) makeInsets 
{ 
    CGRect rect = self.frame; 

    if (hasInset) { 
     UIEdgeInsets insets = {0, 5, 0, 5}; 
     return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)]; 
    } else { 
     UIEdgeInsets insets = {0, 0, 0, 0}; 
     return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)]; 
    } 
} 

문제가 UILabel의 그린 후 그런 일이있다 : 나는 정의 방법을 썼다 않았다 그래서

. [UILabelSubclass setNeedsDisplay:YES]을 시도했지만 setNeedsDisplay 메소드의 "표시 할 인터페이스 없음"오류가 발생합니다. 기존의 인세 트를 커스텀 커스텀으로 오버 라이딩 할 수있는 방법이 있습니까?

답변

1

서브 클래 싱 중이므로 들여 쓰기 여부를 나타내는 부울 속성을 추가 할 수는 없습니까?

.H 파일

@property BOOL indentText; 

당신이 사용자 정의의 많은 데에 계획하는 경우에 당신은 당신이 만들 수있을 때 상수 스타일의 어떤 종류를 전달할 수

- (id) initWithIndent:(BOOL)indent { 

    if((self = [super init])) { 
     self.indentText = indent; 
    } 

    return self; 
} 

- (void)drawTextInRect:(CGRect)rect { 

    if(self.indentText) { 
     UIEdgeInsets insets = {0, 5, 0, 5}; 
     return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)]; 
    } 
} 

하는 .m 파일 그것을 표시하는 방법을 나타내는 레이블 ...하지만 당신이 할 계획이라면 이것만으로도 간단한 속성을 추가하여 토글 할 수 있습니다.

+0

내가 제공 한 것이 실제로 내 문제를 더 잘 해결할 수 있도록 bool 속성 (hasInset)을 전달하므로 선택한 대답을 제공 할 것입니다. 하지만 다른 사용자가 내 setNeedsDisplay 질문에 대답했습니다. 밀어 주셔서 고마워. – PruitIgoe

+0

네, UILabel을 이미 서브 클래 싱 한 이후로 생각했습니다 ... 코드를 수정하지 않고 외부에서 setNeedsDisplay를 호출하지 않아도되는 이유는 무엇입니까? 이제보기 코드가 좀 더 읽기 쉽습니다 :) – jerrylroberts

2

the method에 인수가 없으므로 setNeedsDisplay과 함께 "표시 할 수없는 인터페이스"오류가 발생합니다. 다음과 같이 작성하면됩니다.

[subclassedLabelInstance setNeedsDisplay]; 

이 오류는 사라집니다. 또한 문제를 해결할 수도 있습니다.

+0

고마워 ... 그게 실수 야. : D – PruitIgoe