ココアタッチ:UIViewの境界線の色と太さを変更する方法?


回答:


596

borderプロパティを設定するには、ビューのレイヤーを使用する必要があります。例えば:

#import <QuartzCore/QuartzCore.h>
...
view.layer.borderColor = [UIColor redColor].CGColor;
view.layer.borderWidth = 3.0f;

この機能にアクセスするには、QuartzCore.frameworkとリンクする必要もあります。


辺ごとに異なる幅/色を設定する方法はありますか?
lluismontero、2011年

2
@lluismontero drawRect:メソッドを使用してカスタムUIViewを作成する必要があると思います
Vladimir

1
これを行うと、このビューに加えて、モーダルUINavigationControllerが終了するようなアニメーションがある場合、多くの不具合が発生しているのを説明するのは困難です。境界線を非アクティブにすると、すべてが通常に戻ります。
Nicu Surdu 2012年

5
ただ他の人に向かいます。Xcodeは、UIColorをCGColorRefにブリッジすることを推奨してい__bridge CGColorRefます。これは動作しません。それ[UIColor blackColor].CGColorは答えで述べたようにする必要があります。
GoodSp33d 2014

6
#import <QuartzCore/QuartzCore.h>もう必要ありません。
意味の重要性

43

Xcode 6アップデート

Xcodeの最新バージョンなので、これに対するより良い解決策があります:

では@IBInspectable、あなたはから直接属性を設定することができますAttributes Inspector

カスタムビュー@IBInspectable属性

これはUser Defined Runtime Attributesあなたのために設定します:

ここに画像の説明を入力してください

これを設定するには2つの方法があります。

オプション1(ストーリーボードでのライブ更新あり)

  1. を作成しますMyCustomView
  2. これはから継承しUIViewます。
  3. 設定します@IBDesignable(これにより、ビューの更新がライブになります)。*
  4. ランタイム属性(ボーダーなど)を @IBInspectable
  5. ビュークラスを MyCustomView
  6. 属性パネルで編集し、ストーリーボードの変更を確認します:)

`

@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つの欠点は、アプリを実行したときにのみ変更が表示されることです。


1
現在のところ、拡張機能はXcodeの最新バージョンでは機能しません。
Edgar Aroutiounian 2015年

1
@EdgarAroutiounianを確認しますが、Swift 1.2では2番目のアプローチは機能しません
セルゲイグリシオフ、

Objective-Cについてはどうですか?
Nik Kov 2017年

チェックアウトspencery2の答えを、さらに以下に、彼はObjective-Cでそれを書くために時間を要した:
MMachinegun

値を格納しないように拡張機能を更新し、set(value){}を使用し、{}がレイヤーに直接アクセスするようにすると、機能します。
LightningStryk

17

希望の色でボーダーを作成することもできます。

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の値です。


6
それは注目に値しますrgそしてbおそらくフロートであるべきです。除数も浮動小数点数である必要がありますr / 255.0

いいえ、Cの構文はあなたの言うとおりではありません。C(およびobjC IS C)のプロモーションは、intをr = 128にキャストして倍にするため、r、g、およびbはintにすることができます:r / 255.0。ちなみにあなたはダブルになり、ClangはCGFloatにキャストします。
ingconti

10

次の@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属性を設定できるはずです。添付画像を見る

属性インスペクター


8

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

@Krish変数に色を格納し、境界線の色を変更する必要がある場合は、変数の値を変更setNeedsDisplayしてビューを呼び出します。これにより、UIViewが強制的に再描画され、暗黙的にが再呼び出しされますdrawRect。テストされていません、これは...
Nicu Surdu '26 / 07/26


7

このコードを試してください:

view.layer.borderColor =  [UIColor redColor].CGColor;
view.layer.borderWidth= 2.0;
[view setClipsToBounds:YES];

4

パフォーマンスに影響を与えるため、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を入れるとこれらが停止する理由がわかりません;-)


3

これを@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

2

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

1

UIViewのレイヤーを編集したくない場合は、いつでも別のビュー内にビューを埋め込むことができます。親ビューの背景色は境界線の色に設定されます。ボーダーの幅に応じて、少し大きくすることもできます。

もちろん、これはビューが透明ではなく、単一の境界線の色だけが必要な場合にのみ機能します。OPはビュー自体に境界線を必要としていましたが、これは実行可能な代替策になる可能性があります。


0

さまざまな側面にさまざまな境界線を追加する場合は、特定のスタイルのサブビューを追加することで、簡単に作成できます。


0

Swift 4.2のアイテムの境界線の色:

let cell = tableView.dequeueReusableCell(withIdentifier: "Cell_lastOrderId") as! Cell_lastOrder
cell.layer.borderWidth = 1
cell.layer.borderColor = UIColor.white.cgColor
cell.layer.cornerRadius = 10
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.