사용자 정의 런타임 속성에서 UIbutton에 대해 CornerRadius 및 BorderWidth를 설정했습니다. layer.borderColor를 추가하지 않고 잘 작동하고 테두리를 검정색으로 표시합니다. 그러나 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 변경 :
.m 파일에 다음 코드를 추가합니다.
#import <QuartzCore/QuartzCore.h>
@implementation CALayer (Additions)
- (void)setBorderColorFromUIColor:(UIColor *)color
{
self.borderColor = color.CGColor;
}
@end
속성 검사기의 눈금 속성
스위프트 4, 엑스 코드 9.2 - 사용 IBDesignable
및 IBInspectable
빌드 사용자 지정 컨트롤 및 실시간 미리보기 인터페이스 빌더의 디자인.
다음은 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.borderColor
type 값 이 필요하기 때문 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에서는 그렇지 않습니다. 그러나 그의 게시물을 따르면 추가됩니다.
이것은 나를 위해 작동합니다.
스위프트 3, Xcode 8.3
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)
}
}
}