[iphone] 코코아 터치 : 어떻게 UIView의 테두리 색상과 두께를 변경하려면?



Answers

Xcode 6 업데이트

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

@IBInspectable 을 사용하면 Attributes Inspector 에서 Attributes를 직접 설정할 수 있습니다.

그러면 User Defined Runtime Attributes 이 설정됩니다.

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

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

  1. MyCustomView 작성하십시오.
  2. 이것은 UIView 에서 상속됩니다.
  3. @IBDesignable 설정 @IBDesignable (그러면 View 업데이트가 실행됩니다.) *
  4. @IBInspectable 런타임 속성 (테두리 등)을 설정하십시오.
  5. Views 클래스를 MyCustomView 변경하십시오.
  6. Attributes Panel에서 편집하고 Storyboard의 변경 사항을 확인하십시오 :)

`

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

* @IBDesignableclass 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 클래스를 변경할 필요가 없다는 것입니다. 그러나이 단점 중 하나는 앱을 실행할 때만 변경 사항이 표시된다는 것입니다.

Question

저는 검사관에게 배경색을 바꿀 수 있음을 알았지 만 테두리 색과 두께도 변경하고 싶습니다. 가능한가요?

감사




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



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 특성을 직접 설정할 수 있어야합니다. 첨부 된 이미지보기

속성 검사기




나는 이것을 @ marczking의 대답 ( 옵션 1 )에 주석으로 추가하고 싶었지만 에 대한 저의 상태는 그것을 막고 있습니다.

나는 객관적인 C.에 대한 @ 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



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을 넣는 것이 이들을 멈추게하는지 확신하지 못합니다 ;-)






Links