답변:
테두리 속성을 설정하려면 뷰의 레이어를 사용해야합니다. 예 :
#import <QuartzCore/QuartzCore.h>
...
view.layer.borderColor = [UIColor redColor].CGColor;
view.layer.borderWidth = 3.0f;
이 기능에 액세스하려면 QuartzCore.framework와 링크해야합니다.
__bridge CGColorRef
합니다. 작동하지 않습니다. [UIColor blackColor].CGColor
답변에서 언급 한대로 해야합니다 .
#import <QuartzCore/QuartzCore.h>
더 이상 필요하지 않습니다.
Xcode의 최신 버전 이후에는 더 나은 해결책이 있습니다.
으로 @IBInspectable
당신은에서 직접 속성을 설정할 수 있습니다 내Attributes Inspector
.
이것은 User Defined Runtime Attributes
당신을 위해 설정합니다 :
이를 설정하는 방법에는 두 가지가 있습니다.
옵션 1 (스토리 보드에서 실시간 업데이트)
MyCustomView
.UIView
.@IBDesignable
(이것은 View 업데이트를 라이브로 만듭니다). *@IBInspectable
MyCustomView
`
@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
매번 수업을 변경할 필요가 없다는 것 입니다. 그러나 이것의 한 가지 단점은 앱을 실행할 때만 변경 사항을 볼 수 있다는 것입니다.
원하는 색상으로 테두리를 만들 수도 있습니다.
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 사이의 값입니다.
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 속성을 설정할 수 있어야합니다. 첨부 된 이미지 참조
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);
}
setNeedsDisplay
하고 뷰를 호출 합니다. UIView를 강제로 다시 그리면서 암시 적으로 다시 호출 drawRect
됩니다. 테스트되지 않음, ...
view.layer.borderWidth = 1.0
view.layer.borderColor = UIColor.lightGray.cgColor
성능 저하로 인해 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에 넣는 것이 왜 멈추는 지 확실하지 않습니다. ;-)
나는 이것을 @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
@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
}
}