Storyboard에서 UIButton BorderColor 변경


80

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

여기에 이미지 설명 입력

답변:


159

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
        }
    }
}

안녕하세요 저는 객관적인 c에서 CustomeView 클래스를 만들고 있지만 스토리 보드 Plz에 표시되지 않습니다.
Pooja Srivastava

이것에 대해 톤 감사합니다! :)
Vijay VS

감사합니다, 최고, 완벽한
Abo3atef

1
깔끔하지만 XCode (버전 8.3.3 (8E3004b))는 미리보기에서 결과를 표시하지 않습니다. 이것이 옳고 변경할 방법이 없습니까 (사용자 정의보기 생성 제외)?
Konstantin Berkov

이것은 가장 우아한 솔루션입니다! 좋은 작업!
Zoltan Vinkler

88

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

Xcode 스 니펫

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

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

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

@end

속성 검사기의 눈금 속성

속성 검사자


5
@jithin Swift 확장으로 작성했습니다. 코드는 다음과 같습니다. extension CALayer {func setBorderColorFromUIColor (color : UIColor) {self.borderColor = color.CGColor}}
Guy

1
트릭이 작동했습니다. 부분적으로. 붉은 색을 지정했는데 도대체 어떻게 검은 색 테두리 색이 나오나요? !!!!!! 어떤 아이디어? 누군가?
static0886

@ static0886 : 적용하려는 색상이 테두리에 설정되지 않았기 때문입니다. 내 이해에 따라이 속성은 런타임에 UIComponent에 반영되지 않으므로 스토리 보드에서 테두리 색상을 설정할 수 없습니다. 기본적으로 검은 색입니다. 속성에서 색상 속성을 제거하여 평가판을 제공하려는 경우.
Javeed

신속하게 다음과 같이 설정할 수 있습니다. self.button.layer.borderColor = <UIColor.CGColor>
Sam

그 layer.borderColorFromUIColor는 스토리 보드에서 나를 위해 일했습니다. 감사합니다.
Ramakrishna

50

스위프트 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)
        }
    }
}

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

여기에 이미지 설명 입력

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

여기에 이미지 설명 입력

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

여기에 이미지 설명 입력


이것은 스토리 보드에서이를 달성하는 데 도움이되었습니다. 귀하의 답변은 구현하기에 매우 명확합니다.
R. Mohan

이 질문에 대한 가장 정확한 대답은 명확하게 설명 된 예입니다.
SeaWarrior404

Objective-C에 추가 할 수 있다면 감사하겠습니다.
Mihir Oza

9

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

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

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

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

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


1

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

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


이 접근 방식을 시도했는데 Xcode가 정말 느려졌습니다. 여러분 모두에게도 일어나고 있습니까?
Meep

0

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

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

0

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

스위프트 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)
    }
}

}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.