UITextField устанавливает цвет границы с помощью раскадровки

Я хотел бы установить цвет границы, используя раскадровку, если это возможно. Я видел ответ здесь: UITextField цвет границы

И я последовал ответ в раскадровке:

enter image description here

Все свойства установлены, но TextField не показывает границы. Какие-либо предложения?

Ответ 1

Хорошо, как отметил Богдан, вы могли бы сделать это с помощью простого подкласса и всего лишь нескольких кусков кода. После этого все будет редактироваться в раскадровке.

  1. Подкласс UITextField
  2. Создайте два свойства, одно для ширины границы и одно для цвета границы
  3. Сделайте эти переменные IBInspectable и весь класс IBDesignable
  4. Вы сможете изменить цвет и ширину границы и увидеть изменения в режиме реального времени.

Код для иллюстрации (Swift 3.1):

@IBDesignable
class FormTextField: UITextField {

    @IBInspectable var borderColor: UIColor? {
        didSet {
            layer.borderColor = borderColor?.cgColor
        }
    }

    @IBInspectable var borderWidth: CGFloat = 0 {
        didSet {
            layer.borderWidth = borderWidth
        }
    }
}

Изменение: вы увидите это в вашем инспекторе атрибутов

Attributes Inspector

Ответ 2

Как сказал Богдан, это правда, что вы не можете найти свойство layer.borderColor в раскадровке, поскольку это время выполнения.

Однако вы можете установить borderColor без использования IB_DESIGNABLE на любом представлении (или подклассе UIView) с небольшим количеством кодировок.

Ниже приведены шаги по его достижению,

  • Создайте категорию в классе CALayer. Объявите свойство типа UIColor с подходящим именем, я назову его как borderUIColor.
  • Запишите установщик и получатель для этого свойства.
  • В методе Setter просто установите свойство borderColor слоя для нового значения цвета CGColor.
  • В методе "Getter" верните UIColor со слоем borderColor.

P.S: Помните, что категории не могут храниться в свойствах. 'borderUIColor' используется как вычисленное свойство, как ссылка для достижения того, на что мы фокусируемся.

Пожалуйста, ознакомьтесь с приведенным ниже примером кода;

Цель C:

Файл интерфейса:

#import <QuartzCore/QuartzCore.h>
#import <UIKit/UIKit.h>

@interface CALayer (BorderProperties)

// This assigns a CGColor to borderColor.
@property (nonatomic, assign) UIColor* borderUIColor;

@end

Файл реализации:

#import "CALayer+BorderProperties.h"

@implementation CALayer (BorderProperties)

- (void)setBorderUIColor:(UIColor *)color {
    self.borderColor = color.CGColor;
}

- (UIColor *)borderUIColor {
    return [UIColor colorWithCGColor:self.borderColor];
}

@end

Swift 3.1:

extension CALayer {
    var borderUIColor: UIColor {
        set {
            self.borderColor = newValue.cgColor
        }

        get {
            return UIColor(cgColor: self.borderColor!)
        }
    }
}

И, наконец, перейдите в свою раскадровку /XIB, следуйте оставшимся шагам;

  1. Щелкните объект View, для которого вы хотите установить границу цвета.
  2. Нажмите "Идентификационный инспектор" (третий слева) на панели "Утилита" (правая сторона экрана).
  3. В разделе "Пользовательские атрибуты времени выполнения" нажмите кнопку "+", чтобы добавить путь к ключу.
  4. Задайте тип пути для ключа "Цвет".
  5. Введите значение для ключевого пути как "layer.borderUIColor". [Помните, что это должно быть имя переменной , объявленное в категории, а не borderColor, здесь borderUIColor].
  6. Наконец, выберите нужный цвет.

Изменить: вы должны установить значение свойства layer.borderWidth как минимум 1, чтобы увидеть цвет рамки.

Построить и запустить. Счастливое кодирование.:)

Ответ 3

Я не уверен, что вы можете изменить цвет границы поля UIText в раскадровке. Вы можете программно изменить его с помощью следующих строк:

UITextField *myTextField = (UITextField *)[self.view viewWithTag:1];
myTextField.borderStyle = UITextBorderStyleLine;
myTextField.layer.borderWidth = 2;
myTextField.layer.borderColor = [[UIColor redColor] CGColor];

Надеюсь, что это поможет.

Ответ 4

Он не отображает границу из-за свойства layer.borderColor. Это атрибуты типа CGColor и Runtime пока не поддерживают это по умолчанию, поэтому, устанавливая только один атрибут неправильно, также отключает другие.

Чтобы сделать это из раскадровки, но также с использованием некоторого кода и подкласса, вы можете использовать этот метод:

Подкласс UITextField и создайте свойство IB_DESIGNABLE UIColor, которое затем преобразуется в CGColor и примените его к self.layer.borderColor.

Ответ 5

Это вариант над ответом @rameswar, который я считаю правильным. Поскольку мы применяем UIColor, я думаю, предпочтительнее написать расширение для UITextField вместо этого (UI вещи вместе):

extension UITextField {

  var borderColor : UIColor? {
    get {
      if let cgcolor = layer.borderColor {
        return UIColor(CGColor: cgcolor)
      } else {
        return nil
      }
    }
    set {
      layer.borderColor = newValue?.CGColor

      // width must be at least 1.0
      if layer.borderWidth < 1.0 {
        layer.borderWidth = 1.0
      }
    }
  }
}

Свойство runtime будет тогда borderColor (поэтому вам не нужно вводить layer., и я думаю, что он немного чище, чем borderUIColor).

borderColor CALayer не является обязательным, поэтому это свойство. Он становится черным при установке nil

И, наконец, layer.borderWidth он установил минимальное значение 1.0, потому что цвет не установлен иначе.

Ответ 6

Помимо маркуса, поставьте полный код:

import UIKit //IMPORTANT
@IBDesignable
class BorderTextField: UITextField {
 @IBInspectable var borderColor: UIColor? {
    didSet {
        layer.borderColor = borderColor?.cgColor
    }
 }
 @IBInspectable var borderWidth: CGFloat = 0 {
    didSet {
        layer.borderWidth = borderWidth
    }
 }
}