[ios] 인터페이스 빌더에서 UIView 테두리 속성을 설정할 수 있습니까?

인터페이스 빌더에서 직접 UIView 테두리 속성 (색상, 두께 등)을 제어 할 수 있습니까? 아니면 프로그래밍 방식으로 만 수행 할 수 있습니까?



답변

실제로 인터페이스 빌더를 통해 뷰 레이어의 일부 속성을 설정할 수 있습니다. xcode를 통해 레이어의 borderWidth 및 cornerRadius를 설정할 수 있다는 것을 알고 있습니다. borderColor는 레이어가 UIColor 대신 CGColor를 원하기 때문에 작동하지 않습니다.

숫자 대신 문자열을 사용해야 할 수도 있지만 작동합니다!

layer.cornerRadius
layer.borderWidth
layer.borderColor

업데이트 : layer.masksToBounds = true

예

업데이트 : 키 경로에 적합한 유형을 선택하십시오.

여기에 이미지 설명을 입력하십시오


답변

Rich86Man의 답변은 정확하지만 카테고리를 사용하여 layer.borderColor와 같은 속성을 프록시 할 수 있습니다. ( ConventionalC CocoaPod에서)

CALayer + XibConfiguration.h :

#import <QuartzCore/QuartzCore.h>
#import <UIKit/UIKit.h>

@interface CALayer(XibConfiguration)

// This assigns a CGColor to borderColor.
@property(nonatomic, assign) UIColor* borderUIColor;

@end

CALayer + XibConfiguration.m :

#import "CALayer+XibConfiguration.h"

@implementation CALayer(XibConfiguration)

-(void)setBorderUIColor:(UIColor*)color
{
    self.borderColor = color.CGColor;
}

-(UIColor*)borderUIColor
{
    return [UIColor colorWithCGColor:self.borderColor];
}

@end

인터페이스 빌더

layer.borderUIColor

결과는 Xcode가 아닌 런타임 동안 분명합니다.

편집 : layer.borderWidth선택한 색상의 테두리를 보려면 1 이상 으로 설정해야합니다 .

스위프트 2.0에서 :

extension CALayer {
    var borderUIColor: UIColor {
        set {
            self.borderColor = newValue.CGColor
        }

        get {
            return UIColor(CGColor: self.borderColor!)
        }
    }
}

스위프트 3.0에서 :

extension CALayer {
    var borderUIColor: UIColor {
        set {
            self.borderColor = newValue.cgColor
        }

        get {
            return UIColor(cgColor: self.borderColor!)
        }
    }
}


답변

iHulk의 것과 비슷한 대답이지만 Swift

프로젝트에 UIView.swift라는 파일을 추가하거나 파일에 붙여 넣으십시오.

import UIKit

@IBDesignable extension UIView {
    @IBInspectable var borderColor: UIColor? {
        set {
            layer.borderColor = newValue?.cgColor
        }
        get {
            guard let color = layer.borderColor else {
                return nil
            }
            return UIColor(cgColor: color)
        }
    }
    @IBInspectable var borderWidth: CGFloat {
        set {
            layer.borderWidth = newValue
        }
        get {
            return layer.borderWidth
        }
    }
    @IBInspectable var cornerRadius: CGFloat {
        set {
            layer.cornerRadius = newValue
            clipsToBounds = newValue > 0
        }
        get {
            return layer.cornerRadius
        }
    }
}

그런 다음 유틸리티 패널> 속성 관리자의 모든 버튼, imageView, 레이블 등에 대해 Interface Builder에서 사용할 수 있습니다.

속성 관리자

참고 : 테두리는 런타임에만 나타납니다.


답변

UIView의 카테고리를 만들고 카테고리의 .h 파일에 추가 할 수 있습니다

@property (nonatomic) IBInspectable UIColor *borderColor;
@property (nonatomic) IBInspectable CGFloat borderWidth;
@property (nonatomic) IBInspectable CGFloat cornerRadius;

이제 이것을 .m 파일에 추가하십시오.

@dynamic borderColor,borderWidth,cornerRadius;

그리고 이것도 마찬가지입니다. m 파일

-(void)setBorderColor:(UIColor *)borderColor{
    [self.layer setBorderColor:borderColor.CGColor];
}

-(void)setBorderWidth:(CGFloat)borderWidth{
    [self.layer setBorderWidth:borderWidth];
}

-(void)setCornerRadius:(CGFloat)cornerRadius{
    [self.layer setCornerRadius:cornerRadius];
}

이제 스토리 보드에서 모든 UIView 하위 클래스 (UILabel, UITextField, UIImageView 등)에 대해이 내용을 볼 수 있습니다.

여기에 이미지 설명을 입력하십시오

그게 .. 아니 어디서나 카테고리를 가져올 필요가 없습니다, 프로젝트에 카테고리의 파일을 추가하고 스토리 보드에서 이러한 속성을 참조하십시오.


답변

들어 스위프트 3, 4 사용할 의향이 있다면, IBInspectableS이있다 :

@IBDesignable extension UIView {
    @IBInspectable var borderColor:UIColor? {
        set {
            layer.borderColor = newValue!.cgColor
        }
        get {
            if let color = layer.borderColor {
                return UIColor(cgColor: color)
            }
            else {
                return nil
            }
        }
    }
    @IBInspectable var borderWidth:CGFloat {
        set {
            layer.borderWidth = newValue
        }
        get {
            return layer.borderWidth
        }
    }
    @IBInspectable var cornerRadius:CGFloat {
        set {
            layer.cornerRadius = newValue
            clipsToBounds = newValue > 0
        }
        get {
            return layer.cornerRadius
        }
    }
}


답변

이 속성을 설정할 수 있지만 실제로는 IB에 반영되지 않습니다. 따라서 기본적으로 IB로 코드를 작성하는 경우 소스 코드에서도 수행 할 수 있습니다.


답변

시간을 절약하려면 두 가지 UIViews를 서로 위에 사용 하십시오. 하나는 테두리 색이고 다른 하나는 테두리 색이 작기 때문에 경계 효과가 나타납니다. 나는 이것이 우아한 해결책이라고 생각하지 않지만 Apple이 조금 더 신경을 쓴다면 이것을 할 필요가 없습니다.