Storyboard에서 UIButton BorderColor 변경 대해 CornerRadius 및 BorderWidth를 설정했습니다. layer.borderColor를

사용자 정의 런타임 속성에서 UIbutton에 대해 CornerRadius 및 BorderWidth를 설정했습니다. layer.borderColor를 추가하지 않고 잘 작동하고 테두리를 검정색으로 표시합니다. 그러나 layer.borderColor 를 추가 하면 작동하지 않습니다 (테두리가 표시되지 않음).

여기에 이미지 설명 입력



답변

Swift의 경우 :

여기에 이미지 설명 입력

스위프트 3 :

extension UIView {

    @IBInspectable var cornerRadius: CGFloat {
        get {
            return layer.cornerRadius
        }
        set {
            layer.cornerRadius = newValue
            layer.masksToBounds = newValue > 0
        }
    }

    @IBInspectable var borderWidth: CGFloat {
        get {
            return layer.borderWidth
        }
        set {
            layer.borderWidth = newValue
        }
    }

    @IBInspectable var borderColor: UIColor? {
        get {
            return UIColor(cgColor: layer.borderColor!)
        }
        set {
            layer.borderColor = newValue?.cgColor
        }
    }
}

스위프트 2.2 :

extension UIView {

    @IBInspectable var cornerRadius: CGFloat {
        get {
            return layer.cornerRadius
        }
        set {
            layer.cornerRadius = newValue
            layer.masksToBounds = newValue > 0
        }
    }

    @IBInspectable var borderWidth: CGFloat {
        get {
            return layer.borderWidth
        }
        set {
            layer.borderWidth = newValue
        }
    }

    @IBInspectable var borderColor: UIColor? {
        get {
            return UIColor(CGColor: layer.borderColor!)
        }
        set {
            layer.borderColor = newValue?.CGColor
        }
    }
}


답변

나는 대답을 얻었다. layer.borderColor 대신 borderColor 변경 :

Xcode 스 니펫

.m 파일에 다음 코드를 추가합니다.

#import <QuartzCore/QuartzCore.h>
@implementation CALayer (Additions)

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

@end

속성 검사기의 눈금 속성

속성 검사자


답변

스위프트 4, 엑스 코드 9.2 – 사용 IBDesignableIBInspectable빌드 사용자 지정 컨트롤 및 실시간 미리보기 인터페이스 빌더의 디자인.

다음은 Swift의 샘플 코드입니다 UIKit. ViewController.swift 바로 아래에 있습니다 .

@IBDesignable extension UIButton {

    @IBInspectable var borderWidth: CGFloat {
        set {
            layer.borderWidth = newValue
        }
        get {
            return layer.borderWidth
        }
    }

    @IBInspectable var cornerRadius: CGFloat {
        set {
            layer.cornerRadius = newValue
        }
        get {
            return layer.cornerRadius
        }
    }

    @IBInspectable var borderColor: UIColor? {
        set {
            guard let uiColor = newValue else { return }
            layer.borderColor = uiColor.cgColor
        }
        get {
            guard let color = layer.borderColor else { return nil }
            return UIColor(cgColor: color)
        }
    }
}

보기에서 검사 가능한 속성으로 이동하면 이러한 속성을 시각적으로 찾고 속성을 편집해야합니다.

여기에 이미지 설명 입력

변경 사항은 사용자 정의 런타임 속성에도 반영됩니다.

여기에 이미지 설명 입력

빌드 시간과 짜잔에 실행하십시오! 테두리가있는 명확한 둥근 버튼이 표시됩니다.

여기에 이미지 설명 입력


답변

설명, 아마도 여기에 다른 답변 중 일부에서 손실 될 수 있습니다.

이 속성이 설정되지 않은 이유는 layer.borderColortype 값 이 필요하기 때문 CGColor입니다.

그러나 UIColor인터페이스 빌더의 사용자 정의 런타임 속성을 통해 유형 만 설정할 수 있습니다!

따라서 Interface Builder를 통해 UIColor를 프록시 속성으로 설정 한 다음 해당 호출을 가로 채서 layer.borderColor속성에 해당하는 CGColor를 설정해야 합니다.

CALayer에 범주를 만들고 키 경로를 고유 한 새 “속성”( borderColorFromUIColor)으로 설정 한 다음 범주에서 해당 설정자 ( setBorderColorFromUIColor:)를 재정 의하여이를 수행 할 수 있습니다 .


답변

이를 수행하는 훨씬 더 좋은 방법이 있습니다! @IBInspectable을 사용해야합니다. Mike Woelmer의 블로그 항목은 https://spin.atomicobject.com/2017/07/18/swift-interface-builder/ 에서 확인하세요.

실제로 Xcode의 IB에 기능을 추가합니다! 다른 답변의 일부 스크린 샷은 필드가 IB에 존재하는 것처럼 보이지만 적어도 Xcode 9에서는 그렇지 않습니다. 그러나 그의 게시물을 따르면 추가됩니다.


답변

Swift의 경우 기능이 작동하지 않습니다. 원하는 결과를 얻으려면 계산 된 속성이 필요합니다.

extension CALayer {
    var borderColorFromUIColor: UIColor {
        get {
            return UIColor(CGColor: self.borderColor!)
        } set {
            self.borderColor = newValue.CGColor
        }
    }
}


답변

이것은 나를 위해 작동합니다.

스위프트 3, Xcode 8.3

ID 검사기 (이 경우 UIButton

CALayer 확장 :

extension CALayer {
var borderWidthIB: NSNumber {
    get {
        return NSNumber(value: Float(borderWidth))
    }
    set {
        borderWidth = CGFloat(newValue.floatValue)
    }
}
var borderColorIB: UIColor? {
    get {
        return borderColor != nil ? UIColor(cgColor: borderColor!) : nil
    }
    set {
        borderColor = newValue?.cgColor
    }
}
var cornerRadiusIB: NSNumber {
    get {
        return NSNumber(value: Float(cornerRadius))
    }
    set {
        cornerRadius = CGFloat(newValue.floatValue)
    }
}

}