インターフェイスビルダーから直接UIViewボーダープロパティ(色、太さなど)を制御することは可能ですか、それともプログラムでしか行えませんか?
インターフェイスビルダーから直接UIViewボーダープロパティ(色、太さなど)を制御することは可能ですか、それともプログラムでしか行えませんか?
回答:
実際には、インターフェイスビルダーを使用してビューのレイヤーのいくつかのプロパティを設定できます。xcodeを介してレイヤーのborderWidthとcornerRadiusを設定できることを知っています。おそらくレイヤーがUIColorではなくCGColorを必要としているため、borderColorは機能しません。
数値の代わりに文字列を使用する必要があるかもしれませんが、それは機能します!
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 に設定する必要もあります。
Swift 2.0の場合:
extension CALayer {
var borderUIColor: UIColor {
set {
self.borderColor = newValue.CGColor
}
get {
return UIColor(CGColor: self.borderColor!)
}
}
}
Swift 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
}
}
}
これは、Utilities Panel> Attributes Inspectorのすべてのボタン、imageView、labelなどのInterface Builderで利用できます。
注:境界線は実行時にのみ表示されます。
@IBDesignable
拡張機能の最初から削除するまで、このアプローチで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あなたが使用することに喜んでいる場合は、IBInspectable
S、これがあります:
@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でコードを書いているなら、あなたはあなたのソースコードでそれをすることもできます。
時間を節約したい場合は、2つUIViews
重ねて使用します。後ろの1つを境界線の色にし、前の1つを小さくすると、境界線の効果が得られます。私もこれがエレガントな解決策だとは思いませんが、Appleがもう少し気にかけているなら、あなたはこれをする必要はありません。
ここですべての解決策を試してもストーリーボードが機能しない
したがって、常に完璧な答えはコードを使用することです。UIViewのIBOutletインスタンスを作成し、プロパティを追加するだけです。
短い答え :
layer.cornerRadius = 10
layer.borderWidth = 1
layer.borderColor = UIColor.blue.cgColor
長い答え:
customUIView.layer.cornerRadius = 10
pcustomUIView.layer.borderWidth = 2
customUIView.layer.borderColor = UIColor.blue.cgColor