인터페이스 빌더에서 직접 UIView 테두리 속성 (색상, 두께 등)을 제어 할 수 있습니까? 아니면 프로그래밍 방식으로 만 수행 할 수 있습니까?
인터페이스 빌더에서 직접 UIView 테두리 속성 (색상, 두께 등)을 제어 할 수 있습니까? 아니면 프로그래밍 방식으로 만 수행 할 수 있습니까?
답변:
실제로 인터페이스 빌더를 통해 뷰 레이어의 일부 속성을 설정할 수 있습니다. xcode를 통해 레이어의 borderWidth 및 cornerRadius를 설정할 수 있다는 것을 알고 있습니다. borderColor는 레이어가 UIColor 대신 CGColor를 원하기 때문에 작동하지 않습니다.
숫자 대신 문자열을 사용해야 할 수도 있지만 작동합니다!
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 이상 으로 설정해야합니다 .
스위프트 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!)
}
}
}
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에서 사용할 수 있습니다.
참고 : 테두리는 런타임에만 나타납니다.
@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로 코드를 작성하는 경우 소스 코드에서도 수행 할 수 있습니다.
시간을 절약하려면 두 가지 UIViews
를 서로 위에 사용 하십시오. 하나는 테두리 색이고 다른 하나는 테두리 색이 작기 때문에 경계 효과가 나타납니다. 나는 이것이 우아한 해결책이라고 생각하지 않지만 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