ユーザー定義のランタイム属性のUIbuttonにCornerRadiusとBorderWidthを設定します。 layer.borderColorを追加しなくてもうまく機能し、境界線を黒色で表示します。ただし、add layer.borderColorが機能しない場合(境界線は表示されません)。
Swiftの場合:
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
}
}
}
Swift 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 to layer.borderColorFromUIColor
.mファイルにコードを追加します
#import <QuartzCore/QuartzCore.h>
@implementation CALayer (Additions)
- (void)setBorderColorFromUIColor:(UIColor *)color
{
self.borderColor = color.CGColor;
}
@end
ティック属性インスペクターのプロパティ
Swift 4、Xcode 9.2-IBDesignable
およびIBInspectable
を使用して、カスタムコントロールを構築し、Interface Builderでデザインをライブプレビューします。
Swiftのサンプルコードを次に示します。ViewController.SwiftのUIKit
のすぐ下に配置します。
@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
にはCGColor
型の値が必要だからです。
ただし、UIColor
タイプのみが、Interface Builderのユーザー定義ランタイム属性を介して設定できます!
そのため、Interface Builderを介してUIColorをプロキシプロパティに設定し、その呼び出しをインターセプトして、同等のCGColorをlayer.borderColor
プロパティに設定する必要があります。
これは、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
}
}
}
これは私のために動作します。
Swift 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)
}
}
}