Какао Touch: Как изменить цвет и толщину границы UIView? - PullRequest
269 голосов
/ 25 июля 2010

Я видел в инспекторе, что я могу изменить цвет фона, но я хотел бы также изменить цвет и толщину границы, возможно ли это?

Спасибо

Ответы [ 13 ]

586 голосов
/ 25 июля 2010

Вам нужно использовать слой вида, чтобы установить свойство border.Например:

#import <QuartzCore/QuartzCore.h>
...
view.layer.borderColor = [UIColor redColor].CGColor;
view.layer.borderWidth = 3.0f;

Вам также нужно связаться с QuartzCore.framework для доступа к этой функции.

40 голосов
/ 16 марта 2015

Xcode 6 обновление

Начиная с последней версии XCode, есть лучшее решение для этого:

С помощью @IBInspectable вы можете устанавливать атрибуты напрямую из в пределах Attributes Inspector.

My Custom View @IBInspectable Attributes

Это устанавливает User Defined Runtime Attributes для вас:

enter image description here

Существует два подхода к настройке:

Вариант 1 (с живым обновлением в раскадровке)

  1. Создать MyCustomView.
  2. Это наследуется от UIView.
  3. Установить @IBDesignable (активирует обновление View). *
  4. Установите атрибуты времени выполнения (границы и т. Д.) С помощью @IBInspectable
  5. Измените класс просмотров на MyCustomView
  6. Отредактируйте на панели атрибутов и посмотрите изменения в раскадровке:)

`

@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. Однако одним из недостатков этого является то, что вы увидите изменения только при запуске приложения.

16 голосов
/ 04 ноября 2011

Вы также можете создать рамку с цветом вашего желания.

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.

10 голосов
/ 11 марта 2016

Добавить следующие @IBInspectables в расширение UIView

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 непосредственно из инспектора атрибутов. Смотрите прикрепленное изображение

Инспектор атрибутов

8 голосов
/ 16 июня 2012

Когда я использую решение Владимира 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);    
}
7 голосов
/ 04 января 2017
view.layer.borderWidth = 1.0
view.layer.borderColor = UIColor.lightGray.cgColor
6 голосов
/ 26 августа 2016

Попробуйте этот код:

view.layer.borderColor =  [UIColor redColor].CGColor;
view.layer.borderWidth= 2.0;
[view setClipsToBounds:YES];
4 голосов
/ 24 апреля 2013

Я бы не советовал переопределять drawRect из-за снижения производительности.

Вместо этого я бы изменил свойства класса, как показано ниже (в вашем пользовательском интерфейсе):

  - (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
      self.layer.borderWidth = 2.f;
      self.layer.borderColor = [UIColor redColor].CGColor;
    }
  return self;

Я не видел никаких глюков при использовании вышеуказанного подхода - не уверен, почему включение initWithFrame останавливает это; -)

3 голосов
/ 19 декабря 2015

Я хотел добавить это к ответу @ marczking ( Вариант 1 ) в качестве комментария, но мой низкий статус на StackOverflow препятствует этому.

Я написал ответ @ marczking на Objective 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
2 голосов
/ 28 июля 2016

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