인터페이스 빌더에서 UIView 테두리 속성을 설정할 수 있습니까?


184

인터페이스 빌더에서 직접 UIView 테두리 속성 (색상, 두께 등)을 제어 할 수 있습니까? 아니면 프로그래밍 방식으로 만 수행 할 수 있습니까?



1
내가 한 것처럼 누군가 Google에서 온 경우를 대비하여. 이러한 변경 사항이 IB에 반영되는 것을 보려면 UIView의 하위 클래스를 만들고 IB에서 조작하려는 View에 할당하면됩니다.
Kanongata

답변:


392

실제로 인터페이스 빌더를 통해 뷰 레이어의 일부 속성을 설정할 수 있습니다. xcode를 통해 레이어의 borderWidth 및 cornerRadius를 설정할 수 있다는 것을 알고 있습니다. borderColor는 레이어가 UIColor 대신 CGColor를 원하기 때문에 작동하지 않습니다.

숫자 대신 문자열을 사용해야 할 수도 있지만 작동합니다!

layer.cornerRadius
layer.borderWidth
layer.borderColor

업데이트 : layer.masksToBounds = true

예

업데이트 : 키 경로에 적합한 유형을 선택하십시오.

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


3
귀하와 Peter DeWeese에게 : Xcode 4.6.3을 사용하며 CALayer 인터페이스를 구현하지 않고도 키 경로 유형을 "Color"로 설정할 수 있습니다.

39
불행히도 layer.borderColor는 이런 식으로 설정할 수 없습니다. CGColorRef이지만 IB 색상 값 유형은 UIColor입니다.
mrgrieves 2013

12
이것이 사용자 정의 런타임 속성이하는 일입니다! 하하, 2011 년부터 iOS를 위해 글을 쓰고 있는데 그 분야가 무엇인지 배우지 못했습니다. 이 멋진 답변에 감사드립니다.
Andy Ibanez

3
좋지만 각 속성에 올바른 유형을 설정해야합니다. 예를 들어 "layer.cornerRadius"의 유형은 "String"대신 "Number"로 설정해야합니다!
Peter Kreinz

5
또한 cornerRadius가 작동하려면 "경계로 클리핑"확인란을 선택하는 것을 잊지 마십시오.
Pierre-Olivier Simonard

183

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 이상 으로 설정해야합니다 .

스위프트 2.0에서 :

extension CALayer {
    var borderUIColor: UIColor {
        set {
            self.borderColor = newValue.CGColor
        }

        get {
            return UIColor(CGColor: self.borderColor!)
        }
    }
}

스위프트 3.0에서 :

extension CALayer {
    var borderUIColor: UIColor {
        set {
            self.borderColor = newValue.cgColor
        }

        get {
            return UIColor(cgColor: self.borderColor!)
        }
    }
}

나는 이것을 위해 나를 도울 수 없다. .m 파일은 borderColor에 대해 borderColor에 대해 신음 소리를 내고이를 수정 한 후에도 여전히 경고를 표시하고 런타임에 테두리 색이 렌더링되지 않습니다. 내에서 다른 비트는 내가 당신이 더 제발 설명 할 수있다, 나는의 CALayer 부분을 이해 해달라고하지 구현의 CALayer (NameOfFile) @ 구현 NameOfFile, @ 가지고있다
데이브 헤이그

2
@PeterDeWeese 위대한 답변! =)
c-villain

1
실제로 borderWidth와 함께 Number를 사용하고 NSNumber를 승인 할 수 있습니다. 잘 작동합니다.
Peter DeWeese

1
이것은 내 의견으로는 BorderColor의 문제를 해결하는 가장 좋은 해결책입니다. 카테고리의 환상적인 사용!
EricWasTaken

1
스위프트에서 근무했습니다!
KOTIOS

81

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

그런 다음 유틸리티 패널> 속성 관리자의 모든 버튼, imageView, 레이블 등에 대해 Interface Builder에서 사용할 수 있습니다.

속성 관리자

참고 : 테두리는 런타임에만 나타납니다.


@Gaurav 어떤 오류가 보입니까? 어느 컴포넌트 (UIButton, UILabel 등)에서 사용하고 있습니까?
Axel Guilmin

더 자세한 정보 없이는 도와 드릴 수 없습니다 :(
Axel Guilmin

2
@IBDesignable확장의 시작 부분에서 제거 할 때 까지이 방법으로 Interface Builder 충돌이 발생했습니다 .
Albert Bori

1
대단하다 ... 고마워! XCode 8.2.1을 사용하고 있습니다.
bobwki

1
매우 편리하고 깔끔합니다! 감사!
Karl-John Chow

56

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 등)에 대해이 내용을 볼 수 있습니다.

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

그게 .. 아니 어디서나 카테고리를 가져올 필요가 없습니다, 프로젝트에 카테고리의 파일을 추가하고 스토리 보드에서 이러한 속성을 참조하십시오.


2
drawRect를 사용하여 IB가 사용자 정의보기를 다시 그리도록 IB_DESIGNABLE로 보완하십시오. method developer.apple.com/library/ios/recipes/…
txulu

3
인터페이스 라인 전에 .h 파일에 IB_DESIGNABLE을 작성하면 .m에 @dynamic 라인을 추가 할 필요가 없습니다.
Jasmeet

@ user1618612는 해상도와 관련이 없으며 일반 레이어 속성 만 설정합니다.
iHulk

11

들어 스위프트 3, 4 사용할 의향이 있다면, IBInspectableS이있다 :

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

이것은 나를위한 최고의 솔루션입니다
Mục Đồng

좋은 해결책, 감사합니다
Ebtehal___

7

이 속성을 설정할 수 있지만 실제로는 IB에 반영되지 않습니다. 따라서 기본적으로 IB로 코드를 작성하는 경우 소스 코드에서도 수행 할 수 있습니다.


1
MVC에 오신 것을 환영합니다! 당신은 속성이 코드에 있어서는 안된다는 것을 봅니다 !
Alejandro Iván

2
^ 이것은 MVC가 아닙니다.
앤드류 플럼 머

1
이 코드는 컨트롤러에가는 시간의 95 %를 고려할 때 :-) 물론 제대로 서브 클래스 또는 단지 구성 코딩을 통해 다음보기를 확장해야합니다, 또한 MVC입니다
다니엘 Bernardini

4

시간을 절약하려면 두 가지 UIViews를 서로 위에 사용 하십시오. 하나는 테두리 색이고 다른 하나는 테두리 색이 작기 때문에 경계 효과가 나타납니다. 나는 이것이 우아한 해결책이라고 생각하지 않지만 Apple이 조금 더 신경을 쓴다면 이것을 할 필요가 없습니다.


10
해결 방법은 이제 시간을 절약하고 향후 더 많은 시간을 낭비합니다.
Lachezar Todorov

0

당신이 설정 layer.masksToBounds = true하고 휴식을 취할 때만 절대적으로 가능합니다 .


-1

스토리 보드는 모든 솔루션을 시도한 후에도 항상 작동하지 않습니다.

항상 코드를 사용하는 것이 가장 좋습니다. UIView의 IBOutlet 인스턴스를 만들고 속성을 추가하십시오.

짧은 답변 :

layer.cornerRadius = 10
layer.borderWidth = 1
layer.borderColor = UIColor.blue.cgColor

긴 대답 :

UIView / UIButton 등의 둥근 모서리

customUIView.layer.cornerRadius = 10

테두리 두께

pcustomUIView.layer.borderWidth = 2

테두리 색

customUIView.layer.borderColor = UIColor.blue.cgColor

질문은 매우 구체적이며 Interface Builder에서 수행하는 방법을 묻습니다. 당신의 대답은 관련이 없습니다.
Shinnyx

-5

다음 2 가지 간단한 코드를 추가하십시오 :

self.YourViewName.layer.cornerRadius = 15
self.YourViewName.layer.masksToBounds = true

잘 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.