回答:
borderプロパティを設定するには、ビューのレイヤーを使用する必要があります。例えば:
#import <QuartzCore/QuartzCore.h>
...
view.layer.borderColor = [UIColor redColor].CGColor;
view.layer.borderWidth = 3.0f;
この機能にアクセスするには、QuartzCore.frameworkとリンクする必要もあります。
__bridge CGColorRef
ます。これは動作しません。それ[UIColor blackColor].CGColor
は答えで述べたようにする必要があります。
#import <QuartzCore/QuartzCore.h>
もう必要ありません。
Xcodeの最新バージョンなので、これに対するより良い解決策があります:
では@IBInspectable
、あなたはから直接属性を設定することができます内Attributes Inspector
。
これはUser Defined Runtime Attributes
あなたのために設定します:
これを設定するには2つの方法があります。
オプション1(ストーリーボードでのライブ更新あり)
MyCustomView
。UIView
ます。@IBDesignable
(これにより、ビューの更新がライブになります)。*@IBInspectable
MyCustomView
`
@IBDesignable
class MyCustomView: UIView {
@IBInspectable var cornerRadius: CGFloat = 0 {
didSet {
layer.cornerRadius = cornerRadius
layer.masksToBounds = cornerRadius > 0
}
}
@IBInspectable var borderWidth: CGFloat = 0 {
didSet {
layer.borderWidth = borderWidth
}
}
@IBInspectable var borderColor: UIColor? {
didSet {
layer.borderColor = borderColor?.CGColor
}
}
}
* @IBDesignable
開始時に設定されている場合にのみ機能しますclass MyCustomView
オプション2(Swift 1.2以降は機能しません。コメントを参照してください)
UIViewクラスを拡張します。
extension UIView {
@IBInspectable var cornerRadius: CGFloat = 0 {
didSet {
layer.cornerRadius = cornerRadius
layer.masksToBounds = cornerRadius > 0
}
}
@IBInspectable var borderWidth: CGFloat = 0 {
didSet {
layer.borderWidth = borderWidth
}
}
@IBInspectable var borderColor: UIColor? {
didSet {
layer.borderColor = borderColor?.CGColor
}
}
}
このようにして、デフォルトのビューには常にの追加の編集可能なフィールドがありAttributes Inspector
ます。もう1つの利点は、クラスをMycustomView
毎回変更する必要がないことです。ただし、これの1つの欠点は、アプリを実行したときにのみ変更が表示されることです。
希望の色でボーダーを作成することもできます。
view.layer.borderColor = [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1.0].CGColor;
* r、g、bは0〜255の値です。
次の@IBInspectablesをUIView拡張に追加します
extension UIView {
@IBInspectable var borderWidth: CGFloat {
get {
return layer.borderWidth
}
set(newValue) {
layer.borderWidth = newValue
}
}
@IBInspectable var borderColor: UIColor? {
get {
if let color = layer.borderColor {
return UIColor(CGColor: color)
}
return nil
}
set(newValue) {
layer.borderColor = newValue?.CGColor
}
}
}
そして、属性インスペクタから直接borderColorおよびborderWidth属性を設定できるはずです。添付画像を見る
VladimirのCALayerソリューションを使用すると、ビューの上に、モーダルUINavigationControllerが閉じるようなアニメーションがあると、多くの不具合が発生し、描画パフォーマンスの問題が発生します。
したがって、これを実現する別の方法ですが、グリッチやパフォーマンスの損失はありませんが、カスタムUIViewを作成し、次のdrawRect
ようにメッセージを実装します。
- (void)drawRect:(CGRect)rect
{
CGContextRef contextRef = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(contextRef, 1);
CGContextSetRGBStrokeColor(contextRef, 255.0, 255.0, 255.0, 1.0);
CGContextStrokeRect(contextRef, rect);
}
setNeedsDisplay
してビューを呼び出します。これにより、UIViewが強制的に再描画され、暗黙的にが再呼び出しされますdrawRect
。テストされていません、これは...
view.layer.borderWidth = 1.0
view.layer.borderColor = UIColor.lightGray.cgColor
パフォーマンスに影響を与えるため、drawRectをオーバーライドすることはお勧めしません。
代わりに、以下のように(カスタムuiviewで)クラスのプロパティを変更します。
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
self.layer.borderWidth = 2.f;
self.layer.borderColor = [UIColor redColor].CGColor;
}
return self;
上記のアプローチをとったときにグリッチは見られませんでした-initWithFrameを入れるとこれらが停止する理由がわかりません;-)
これを@marczkingの回答に追加したかった(オプション1)にコメントとしてが、StackOverflowのステータスが低いため、これを防ぐことができます。
目的Cに対する@marczkingの回答の移植を行いました。@ marczkingに感謝します。
UIView + Border.h:
#import <UIKit/UIKit.h>
IB_DESIGNABLE
@interface UIView (Border)
-(void)setBorderColor:(UIColor *)color;
-(void)setBorderWidth:(CGFloat)width;
-(void)setCornerRadius:(CGFloat)radius;
@end
UIView + Border.m:
#import "UIView+Border.h"
@implementation UIView (Border)
// Note: cannot use synthesize in a Category
-(void)setBorderColor:(UIColor *)color
{
self.layer.borderColor = color.CGColor;
}
-(void)setBorderWidth:(CGFloat)width
{
self.layer.borderWidth = width;
}
-(void)setCornerRadius:(CGFloat)radius
{
self.layer.cornerRadius = radius;
self.layer.masksToBounds = radius > 0;
}
@end
@IBInspectableはiOS 9、Swift 2.0で私のために働いています
extension UIView {
@IBInspectable var borderWidth: CGFloat {
get {
return layer.borderWidth
}
set(newValue) {
layer.borderWidth = newValue
}
}
@IBInspectable var cornerRadius: CGFloat {
get {
return layer.cornerRadius
}
set(newValue) {
layer.cornerRadius = newValue
}
}
@IBInspectable var borderColor: UIColor? {
get {
if let color = layer.borderColor {
return UIColor(CGColor: color)
}
return nil
}
set(newValue) {
layer.borderColor = newValue?.CGColor
}
}