Storyboard나 xib로 UIView의 테두리·각환 설정을 한다(Objective-C)

6363 단어 XcodeiOSObjective-C

할 일



UIView의 테두리·각환 설정은 자주 있다고 생각합니다.
일일이 코드로 쓰는 것 귀찮네요.
여기를 Storyboard나 xib 등의 Interface Builder측에서 설정할 수 있도록 하고 싶습니다.

이 기사는 Objective-C 버전입니다.
Swift 버전은 여기입니다.

대응 정책



UIView의 카테고리를 작성해, UIView의 서브 클래스에 대해 IB측에서의 테두리·각환 설정을 가능하게 합니다.

샘플 코드



IB에서 설정하고 싶은 프로퍼티를 기재해 갑니다.
이번에는 테두리・각환에 관한 하기 프로퍼티를 추가했습니다.

UIView+Border.h
#import <UIKit/UIKit.h>

@interface UIView (Border)
@property (nonatomic) IBInspectable UIColor *borderColor;
@property (nonatomic) IBInspectable CGFloat borderWidth;
@property (nonatomic) IBInspectable CGFloat cornerRadius;
@end

UIView+Border.m
#import "UIView+Border.h"

@implementation UIView (Border)

// 枠線の色
- (UIColor *)borderColor
{
    return [UIColor colorWithCGColor:self.layer.borderColor];
}
- (void)setBorderColor:(UIColor *)borderColor
{
    self.layer.borderColor = borderColor.CGColor;
}

// 枠線のWidth
-(CGFloat)borderWidth
{
    return self.layer.borderWidth;
}
- (void)setBorderWidth:(CGFloat)borderWidth
{
    self.layer.borderWidth = borderWidth;
}

// 角丸設定
-(CGFloat)cornerRadius
{
    return self.layer.cornerRadius;
}
- (void)setCornerRadius:(CGFloat)cornerRadius
{
    self.layer.cornerRadius = cornerRadius;
    self.layer.masksToBounds = cornerRadius > 0;
}

@end

테두리의 색상은 CGColor이므로주의하시기 바랍니다.
IB 측에서는 UIColor가 설정되므로 setter로 CGColor로 하고 있습니다.

그리고는 사용하고 싶은 클래스로 임포트 하면 됩니다.

IBInspectable



위 코드와 같이 속성에 IBInspectable을 부여하면,
Xcode 유틸리티 영역 (오른쪽 창)의 Attributes Inspector에서 위의 속성을 추가합니다.



그리고는 IB상에서 설정해 갈 뿐입니다.
테두리·각환 설정의 코드는 필요 없게 되고, 그 설정을 위해서만의 IBOutlet도 불필요하게 됩니다.



마지막으로



지금까지는 위의 설정을 코드로 실시했습니다.
하지만 그 설정을 위해서만 IBOutlet에서의 연결을 하거나 비슷한 코드를 여러 번 쓰는 것은 비효율적이라고 생각하도록.
어떻게 될까요? 라고 동료에게 상담한 바, 본 기사와 같은 것이 가능한 것을 가르쳤습니다.
그것을 실제로 시도한 것이 계기입니다.

UIView를 계승하고 있는 클래스라면, 부품을 추가한 것만으로 범용적으로 사용할 수 있는 것이 좋은 곳이라고 생각합니다.

이 기사의 Swift 버전은 여기입니다.

좋은 웹페이지 즐겨찾기