코코아 터치 : UIView의 테두리 색상과 두께를 변경하는 방법?


답변:


596

테두리 속성을 설정하려면 뷰의 레이어를 사용해야합니다. 예 :

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

이 기능에 액세스하려면 QuartzCore.framework와 링크해야합니다.


각면마다 다른 너비 / 색상을 설정하는 방법이 있습니까?
lluismontero

2
@lluismontero drawRect를 사용하여 사용자 정의 UIView를 작성해야 할 것을 두려워합니다. 그 방법
Vladimir

1
이 작업을 수행 하고이 뷰 위에 모달 UINavigationController 해제와 같은 애니메이션이 있으면 많은 결함이 발생하는 것을 볼 수 있습니다. 설명하기가 어렵습니다. 테두리를 비활성화하면 모든 것이 정상으로 돌아갑니다.
Nicu Surdu

5
그냥 다른 사람들을 위해 머리를 숙입니다. Xcode는 UIColor를 CGColorRef로 브리징하는 것을 제안 __bridge CGColorRef합니다. 작동하지 않습니다. [UIColor blackColor].CGColor답변에서 언급 한대로 해야합니다 .
GoodSp33d

6
#import <QuartzCore/QuartzCore.h>더 이상 필요하지 않습니다.
의미 문제

43

Xcode 6 업데이트

Xcode의 최신 버전 이후에는 더 나은 해결책이 있습니다.

으로 @IBInspectable당신은에서 직접 속성을 설정할 수 있습니다 Attributes Inspector .

내 사용자 정의보기 @IBInspectable 속성

이것은 User Defined Runtime Attributes당신을 위해 설정합니다 :

여기에 이미지 설명을 입력하십시오

이를 설정하는 방법에는 두 가지가 있습니다.

옵션 1 (스토리 보드에서 실시간 업데이트)

  1. 을 만듭니다 MyCustomView.
  2. 이에서 상속됩니다 UIView.
  3. 설정 @IBDesignable(이것은 View 업데이트를 라이브로 만듭니다). *
  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있습니다. 또 다른 장점은 MycustomView매번 수업을 변경할 필요가 없다는 것 입니다. 그러나 이것의 한 가지 단점은 앱을 실행할 때만 변경 사항을 볼 수 있다는 것입니다.


1
현재 확장 프로그램이 최신 버전의 Xcode에서 작동하지 않습니다.
Edgar Aroutiounian

1
나는 스위프트 1.2 두 번째 방법이 더 이상 작동 말할 만 @EdgarAroutiounian 확인합니다
세르게이 Grischyov에게

Objective-C는 어떻습니까?
Nik Kov

아래에서 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
그것은 그 지적 가치 r, g그리고 b아마도 수레해야한다; 제수도 수레 여야합니다 r / 255.0.

아니요, C 구문은 당신이 말하는 것과 다릅니다. C (및 objC IS C) 프로모션은 다음과 같이 할 때 int r = 128을 두 배로 캐스팅하므로 r, g 및 b는 int가 될 수 있습니다 : r / 255.0. 그건 그렇고 당신은 두 배가되고 Clang은 CGFloat로 캐스팅합니다.
ingconti

10

UIView 확장에 다음 @IBInspectables 추가

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

8
view.layer.borderWidth = 1.0
view.layer.borderColor = UIColor.lightGray.cgColor

1
나는 사람들이 설명없이 투표를받는 것을 정말로 좋아하지 않습니다. 아무도 도와주지 않습니다.
David DelMonte

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의 저의 상태가 그것을 막고 있습니다.

Objective 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

신속한 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.