2015-01-24 8 views
0

UIButton, UIView 및 UITextField와 같은 UIComponents를 변경해야하는 요구 사항이 있습니다. 내가해야 할 일은 디폴트 인 예리한 사각형이 아니라 둥근 테두리의 반경을 변경하는 것입니다.뷰를 서브 클래 싱하는 동안 코드 중복성을 줄이는 방법은 무엇입니까?

- (void)drawRect:(CGRect)rect { 
    // Drawing code 
    CALayer *layer = [self layer]; 
    [layer setMasksToBounds:YES]; 
    [layer setCornerRadius:3.0f]; 
    [layer setBorderWidth:1.0f]; 
} 

:

나는이 작업을 수행 한 방법은 UITextField에 UITextFieldRoundCorner과 나는이와의 drawRect 방법을 재정의 한 각 서브 클래스 내에서 UIButtonRoundCorner, 에 UIViewRoundCorner, 있는 UIButton에 UIView의 하위 클래스입니다 코드가 중복되어이 중복성을 제거하는 방법을 알아 내려고합니다. 이 모든 요소는 UIView에서 상속되므로 UIView를 하위 클래스로 만들고 다른 모든 뷰에서 구현할 수 있습니까?

+3

참고 - 레이어를 조정하기 위해'drawRect :'를 사용하는 것은 옳지 않습니다. 'drawRect :'는 컨트롤의 수명에서 여러 번 호출 될 수 있지만 레이어를 한 번만 조정하면됩니다. 적절한'init ... '메소드에서 그것을 수행하십시오. – rmaddy

+0

제안 해 주셔서 감사합니다 :). 나는 즉시 시행 할 것이다. –

답변

1
protocol RoundedCorner { 
    func makeCornerRadius(radius:CGFloat) 
} 

extension RoundedCorner where Self:UIView{ 
    func makeCornerRadius(radius:CGFloat){ 
     self.layer.cornerRadius = radius 
    } 
} 

class CustomButton: UIButton, RoundedCorner { 

    override func drawRect(rect: CGRect) { 
     super.drawRect(rect) 
     self.makeCornerRadius(5) 
    } 
} 

프로토콜을 만들고 기본 구현을 위해 해당 프로토콜을 확장 할 수 있습니다. 그런 다음 모서리 반지름을 원하는 모든 사용자 정의보기에 대해 해당 프로토콜을 구현하십시오. 이렇게하면 코드 중복성을 최소화 할 수 있습니다.

+1

프로토콜을 확장하는 대신 UIview 자체를 확장하지 않는 이유는 무엇입니까 ?? –

2

이렇게하려면 서브 클래스를 만들 필요가 없습니다. Objective-C에는 기존 클래스에 동작을 추가 할 수있는 멋진 기능이 있습니다. categories.

@implementation UIView (RoundedCorners) 

- (void)ps_addRoundedCorners; 

@end 

@implementation UIView (RoundedCorners) 

- (void)ps_addRoundedCorners { 
    CALayer *layer = [self layer]; 
    [layer setMasksToBounds:YES]; 
    [layer setCornerRadius:3.0f]; 
    [layer setBorderWidth:1.0f]; 
} 

@end 

을하고 UIView 서브 클래스와 함께 사용 :

당신은 UIView에 범주에 방법을 추가 할 수 있습니다

는 (의이 RoundedCorners를 호출하자)

UIButton *button = ... //create a button somehow 
[button ps_addRoundedCorners]; 

메소드 이름의 ps_ 접두사 이름 충돌을 피하는 데 사용됩니다 (누군가 다른 사람이 개인 프레임 워크에서 같은 이름의 메소드를 추가 한 경우).

관련 문제