programing

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

muds 2023. 6. 20. 21:54
반응형

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

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

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

숫자 대신 문자열을 사용해야 할 수도 있지만, 효과가 있습니다!

layer.cornerRadius
layer.borderWidth
layer.borderColor

업데이트: layer.masksToBounds = true

example

업데이트: 키 경로에 적합한 유형 선택:

enter image description here

Rich86Man의 대답은 맞지만, 카테고리를 사용하여 layer.borderColor와 같은 속성을 프록시할 수 있습니다. (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

Interface Builder

layer.borderUIColor

결과는 Xcode가 아닌 런타임 중에 나타납니다.

편집: 설정도 필요합니다.layer.borderWidth선택한 색상의 테두리를 보려면 1 이상이어야 합니다.

Swift 2.0의 경우:

extension CALayer {
    @objc var borderUIColor: UIColor {
        set {
            self.borderColor = newValue.CGColor
        }
    
        get {
            return UIColor(CGColor: self.borderColor!)
        }
    }
}

Swift 3.0의 경우:

extension CALayer {
    @objc 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, 레이블 등에 대해 인터페이스 빌더에서 사용할 수 있습니다.

Attributes Inspector

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

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 등)에 대한 스토리보드에서 이를 확인할 수 있습니다.

enter image description here

바로 그거야..범주를 가져올 필요가 없습니다. 범주의 파일을 프로젝트에 추가하고 스토리보드에서 이러한 속성을 확인하기만 하면 됩니다.

스위프트 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
        }
    }
}

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

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

여기서 모든 솔루션을 시도해도 스토리보드가 항상 작동하지 않습니다.

그래서 항상 완벽한 답은 코드를 사용하는 것입니다. 그냥 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

다음 두 줄의 간단한 코드를 추가하십시오.

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

잘 될 겁니다.

언급URL : https://stackoverflow.com/questions/12301256/is-it-possible-to-set-uiview-border-properties-from-interface-builder

반응형